2010-10-18 8 views
6

Ich versuche, eine sehr einfache Zeichnungsansicht in meiner App zu implementieren. Dies ist nur ein kleiner Teil meiner App, aber es wird zu einem echten Ärger. Dies ist, was ich bisher habe, aber alles, was es gerade anzeigt, ist Morse-Code wie Punkte und Linien.iPad (sehr) einfache Zeichnung

- (void)viewDidLoad { 
     [super viewDidLoad]; 
    self.view.backgroundColor = [UIColor whiteColor]; 
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                 NSUserDomainMask, YES); 
    NSString *docsPath = [paths objectAtIndex:0]; 

    NSString *savePath = [NSString stringWithFormat:@"%@/notePadImage.jpg",docsPath]; 

    NSData *data = [NSData dataWithContentsOfFile:savePath]; 

    UIImage *image = [UIImage imageWithData:data]; 

    if (image == nil) { 
     NSString *pathToBlank = [[NSBundle mainBundle]pathForResource:@"blankNotePadPage" ofType:@"png"]; 
     NSData *data = [NSData dataWithContentsOfFile:pathToBlank]; 
     image = [UIImage imageWithData:data]; 
    } 
    arrayOfTouches = [[NSMutableArray alloc] initWithCapacity:10]; 
    self.drawImage.image = image; 

    mouseMoved = 0; 
    [self.view bringSubviewToFront:closeButton]; 
    [self.view bringSubviewToFront:clearButton]; 
    self.timer = [NSTimer scheduledTimerWithTimeInterval:.02 target:self selector:@selector(drawIt) userInfo:nil repeats:YES]; 

    } 

    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 


    UITouch *touch = [touches anyObject]; 

    [arrayOfTouches addObject:touch]; 




    } 


    - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

    UITouch *touch = [touches anyObject]; 
    [arrayOfTouches addObject:touch]; 


    } 

    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 

    } 

    -(void) drawIt { 

    NSMutableArray *tempArray = [NSMutableArray arrayWithArray:arrayOfTouches]; 
    [arrayOfTouches removeAllObjects]; 
    if ([tempArray count]>1) { 

     [arrayOfTouches removeAllObjects]; 
     CGPoint point1 = [[tempArray objectAtIndex:0] previousLocationInView:self.view];; 
     CGPoint point2; 
     CGPoint point3; 

     for (int i = 0; i < [tempArray count]-1;i = i+1) { 




      UIGraphicsBeginImageContext(self.view.frame.size); 
      [drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
      CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
      CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 3.0); 
      CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0); 
      CGContextMoveToPoint(UIGraphicsGetCurrentContext(), point1.x, point1.y); 
      CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), point2.x, point2.y); 

      CGContextStrokePath(UIGraphicsGetCurrentContext()); 
      CGContextFlush(UIGraphicsGetCurrentContext()); 
      drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 
      [self.view bringSubviewToFront:closeButton]; 
      [self.view bringSubviewToFront:clearButton]; 
      point1 = point2; 

     } 

     } 
    } 

Antwort

10

Eine meiner Apps brauchte auch einige einfache Zeichnung. Hier ist eine leicht modifizierte Version davon. Es funktioniert im Grunde wie hotpaw2 beschreibt. Ich habe eine "Canvas" -Ansicht erstellt, mit der alle Zeichnungen bearbeitet werden können, und ich füge sie einfach dort hinzu, wo sie benötigt wird.

Die Geschwindigkeit ist gut für meine Zwecke.

CanvasView.h:

@interface CanvasView : UIView { 
    NSMutableArray *points; 
} 
@property (nonatomic, retain) NSMutableArray *points; 
@end 

CanvasView.m:

#import "CanvasView.h" 

@implementation CanvasView 

@synthesize points; 

- (id) initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     self.backgroundColor = [UIColor blueColor]; 
    } 
    return self; 
} 

-(void)drawRect:(CGRect)rect 
{ 
    if (self.points.count == 0) 
     return; 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextSetRGBStrokeColor(context, 1.0, 1.0, 1.0, 1.0); //white 
    CGContextSetLineWidth(context, 1.0); 

    CGPoint firstPoint = [[self.points objectAtIndex:0] CGPointValue]; 
    CGContextBeginPath(context); 
    CGContextMoveToPoint(context, firstPoint.x, firstPoint.y); 

    int i = 1; 
    while (i < self.points.count) 
    { 
     CGPoint nextPoint = [[self.points objectAtIndex:i] CGPointValue]; 

     if (nextPoint.x < 0 && nextPoint.y < 0) 
     { 
      CGContextDrawPath(context, kCGPathStroke); 

      if (i < (self.points.count-1)) 
      { 
       CGContextBeginPath(context); 
       CGPoint nextPoint2 = [[self.points objectAtIndex:i+1] CGPointValue];     
       CGContextMoveToPoint(context, nextPoint2.x, nextPoint2.y); 
       i = i + 2; 
      } 
      else 
       i++; 
     } 
     else 
     { 
      CGContextAddLineToPoint(context, nextPoint.x, nextPoint.y); 
      i++; 
     } 
    } 

    CGContextDrawPath(context, kCGPathStroke); 
} 

-(void)dealloc 
{ 
    [points release]; 
    [super dealloc]; 
} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event touchesForView:self] anyObject]; 
    CGPoint location = [touch locationInView:self]; 

    if (self.points == nil) 
    { 
     NSMutableArray *newPoints = [[NSMutableArray alloc] init]; 
     self.points = newPoints; 
     [newPoints release]; 
    } 

    [self.points addObject:[NSValue valueWithCGPoint:(location)]]; 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event touchesForView:self] anyObject]; 
    CGPoint location = [touch locationInView:self]; 
    [self.points addObject:[NSValue valueWithCGPoint:(location)]]; 

    [self setNeedsDisplay]; 
} 

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [[event touchesForView:self] anyObject]; 
    CGPoint location = [touch locationInView:self]; 
    [self.points addObject:[NSValue valueWithCGPoint:(location)]]; 

    CGPoint endPoint = CGPointMake(-99, -99); //"end of path" indicator 
    [self.points addObject:[NSValue valueWithCGPoint:(endPoint)]]; 

    [self setNeedsDisplay]; 
} 

@end 

die canvasView Hinzufügen von wo es gebraucht wird:

CanvasView *cv = [[CanvasView alloc] initWithFrame:CGRectMake(0, 0, 320, 640)]; 
[self.view addSubview:cv]; 
[cv release]; 
+0

das ist genau das, was ich gesucht habe, danke. – Brodie

+0

wie würde ich speichern, was hier als jpg gezeichnet wird? – Slee

+1

'UIGraphicsBeginImageContext (cv.bounds.size); [cv.layer renderInContext: UIGraphicsGetCurrentContext()]; UIImage * image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); NSData * data = UIImageJPEGRepräsentation (image, 1.0f); NSString * Pfad = ...; BOOL gespeichert = [Daten WriteToFile: Pfad atomar: YES]; ' – Anna

4

Nicht beim Berühren von Berührungen zeichnen. Es wird den Touch-Handler so sehr verlangsamen, dass Sie den "connect-the-dots" -Effekt erhalten, den Sie sehen.

Speichern Sie die Touch-Koordinaten in einem Array und planen Sie, sie später zu zeichnen.

Sehen Sie sich einige einfache Animation Tutorials für das Zeichnen in einem DrawRect basierend auf einem SetNeedsDisplay von einer Animation UITimer oder CADisplayLink aufgerufen. Zeichnen Sie alle Ihre Liniensegmente dort mit einer geeigneteren Rate.

+0

danke für den Kommentar - ich gesucht für Tutorials und konnte nichts finden . Ich fand eine, die sich mit dem Zeichnen eines Kreises beschäftigt, also konnte ich anfangen, aber das ist es. Also, was ich tun muss, ist eine Reihe von CGPoints gehalten als NSValues ​​dann haben einen Timer verbinden die Punkte evry 1/4 Sekunde oder so ähnlich? – Brodie