2010-10-18 15 views
6

मैं अपने ऐप में एक बहुत ही सरल ड्राइंग व्यू को लागू करने की कोशिश कर रहा हूं। यह मेरे ऐप का केवल एक छोटा हिस्सा है लेकिन यह एक वास्तविक परेशानी में बदल रहा है। यह मेरे पास अब तक है, लेकिन यह अभी प्रदर्शित हो रहा है यह बिंदु और रेखाओं जैसे मोर्स कोड है।आईपैड (बहुत) सरल ड्राइंग

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

+0

मैं जेपीजी के रूप में यहां क्या खींचा गया हूं उसे कैसे बचाऊंगा? – Slee

+1

'UIGraphicsBeginImageContext (cv.bounds.size); [cv.layer renderInContext: UIGraphicsGetCurrentContext()]; UIImage * छवि = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); एनएसडीएटा * डेटा = यूआईएममेज जेपीईजी प्रस्तुतिकरण (छवि, 1.0 एफ); एनएसएसटींग * पथ = ...; बूल सेव = = डेटा लिखने के लिए फ़ाइल: पथ परमाणु रूप से: हाँ]; ' – Anna

4

स्पर्शों को संभालने के दौरान आकर्षित न करें। यह टच हैंडलर को धीमा कर देगा ताकि आप कनेक्ट-द-डॉट्स-प्रभाव को देख सकें।

किसी सरणी में स्पर्श निर्देशांक सहेजें और बाद में उन्हें आकर्षित करने की योजना बनाएं।

एनीमेशन यूआईटीमर या कैडिसप्ले लिंक द्वारा बुलाए गए सेटएड्स डिस्प्ले के आधार पर ड्रॉरेक्ट में आकर्षित करने के लिए कुछ सरल एनीमेशन ट्यूटोरियल देखें। एक और उपयुक्त दर पर अपने सभी लाइन खंडों को खींचें।

+0

धन्यवाद - मैं खोजा गया ट्यूटोरियल के लिए और कुछ भी नहीं मिला । मैंने एक ऐसा पाया जो एक सर्कल ड्राइंग से संबंधित है, इसलिए मैं शुरू करने में सक्षम था लेकिन यह है। तो मुझे क्या करना है एनएसवीएलयूएस के रूप में आयोजित सीजीपॉइंट्स की एक सरणी रखना है, फिर एक टाइमर 1/4 सेकेंड या कुछ ऐसा इंगित करने वाले बिंदुओं को जोड़ता है? – Brodie

संबंधित मुद्दे