2010-10-18 81 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