2010-10-18 34 views
6

我試圖在我的應用程序中實現一個非常簡單的繪圖視圖。這只是我應用程序的一小部分,但它變成了一個真正的麻煩。這是迄今爲止我所擁有的,但現在顯示的全部是莫爾斯電碼,如點和線。iPad(非常)簡單的繪圖

- (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; 

     } 

     } 
    } 

回答

10

我的一個應用程序還需要一些簡單的繪圖。這是一個稍微修改過的版本。它基本上像hotpaw2描述的那樣工作。我創建了一個處理所有繪圖的「畫布」視圖,我只是在需要的地方添加它。

速度對我來說很好。

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 

添加需要的地方的canvasView:

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

這正是我一直在尋找的東西,謝謝。 – Brodie 2010-10-22 20:44:30

+0

我將如何保存這裏所畫的圖片作爲jpg? – Slee 2010-11-27 21:02:37

+1

'UIGraphicsBeginImageContext(cv.bounds.size); [cv.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage * image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); NSData * data = UIImageJPEGRepresentation(image,1.0f); NSString * path = ...; BOOL保存= [數據writeToFile:原子路徑:YES];' – Anna 2010-11-28 03:55:50

4

處理觸摸時不要畫圖。它會減慢觸摸處理程序的速度,以至於您可能會看到您所看到的連接點效果。

將觸摸座標保存在數組中,並計劃稍後繪製它們。

查看一些簡單的動畫教程,瞭解如何根據由動畫UITimer或CADisplayLink調用的setNeedsDisplay繪製drawRect。以更合適的速度繪製所有線段。

+0

感謝您的評論 - 我搜索爲教程和couldnt找到任何東西。我找到了一個處理繪製一個圓的問題,所以我能夠開始,但那就是它。所以我需要做的是保持CGPoints數組作爲NSValues,然後有一個計時器連接點evry 1/4秒或類似的東西? – Brodie 2010-10-18 16:25:23