2016-05-23 14 views
0

ich folgenden Code bin mit einer digitalen Signatur auf UIView zu erstellen:So entfernen Sie UIBezierPath von UIView auf Schaltfläche klicken?

#import "Signature.h" 

@implementation Signature { 
    UIBezierPath *path; 
    UIImage *incrementalImage; 
    CGPoint pts[5]; // we now need to keep track of the four points of a Bezier segment and the first control point of the next segment 
    uint ctr; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if (self = [super initWithCoder:aDecoder]) 
    { 
     [self setMultipleTouchEnabled:NO]; 
     [self setBackgroundColor:[UIColor greenColor]]; 
     path = [UIBezierPath bezierPath]; 
     [path setLineWidth:2.0]; 
    } 
    return self; 

} 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     [self setMultipleTouchEnabled:NO]; 
     path = [UIBezierPath bezierPath]; 
     [path setLineWidth:2.0]; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect 
{ 
    [incrementalImage drawInRect:rect]; 
    [path stroke]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    ctr = 0; 
    UITouch *touch = [touches anyObject]; 
    pts[0] = [touch locationInView:self]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint p = [touch locationInView:self]; 
    ctr++; 
    pts[ctr] = p; 
    if (ctr == 4) 
    { 
     pts[3] = CGPointMake((pts[2].x + pts[4].x)/2.0, (pts[2].y + pts[4].y)/2.0); // move the endpoint to the middle of the line joining the second control point of the first Bezier segment and the first control point of the second Bezier segment 

     [path moveToPoint:pts[0]]; 
     [path addCurveToPoint:pts[3] controlPoint1:pts[1] controlPoint2:pts[2]]; // add a cubic Bezier from pt[0] to pt[3], with control points pt[1] and pt[2] 

     [self setNeedsDisplay]; 
     // replace points and get ready to handle the next segment 
     pts[0] = pts[3]; 
     pts[1] = pts[4]; 
     ctr = 1; 
    } 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    [self drawBitmap]; 
    [self setNeedsDisplay]; 
    [path removeAllPoints]; 
    ctr = 0; 
} 

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    NSLog(@"hello"); 
    [self touchesEnded:touches withEvent:event]; 
} 

- (void)drawBitmap 
{ 
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, YES, 0.0); 

    if (!incrementalImage) // first time; paint background white 
    { 
     UIBezierPath *rectpath = [UIBezierPath bezierPathWithRect:self.bounds]; 
     [[UIColor greenColor] setFill]; 
     [rectpath fill]; 
    } 
    [incrementalImage drawAtPoint:CGPointZero]; 
    [[UIColor blackColor] setStroke]; 
    [path stroke]; 
    incrementalImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
} 

- (void)erase { 
    NSLog(@"Erase Testing..."); 
    // self->path = nil; //Set current path nil 
    //path = [UIBezierPath bezierPath]; 
    // [self setNeedsDisplay]; 
} 

Ich rufe löschen Methode auf die Schaltfläche klicken, aber es funktioniert nicht für mich. Ich weiß nicht, warum es nicht reagiert.

+0

Können Sie auf die Schaltfläche Code hier zeigen? – abhishekkharwar

+0

ja natürlich rufe ich diese Methode aus einer anderen Klasse - (IBAction) löschen: (id) sender { NSLog (@ "callPrint"); self> printMessage = [[Signaturzuweisung] init]; [self> printMessage löschen]; } –

+0

Haben Sie die IBAction-Verbindung hergestellt? – abhishekkharwar

Antwort

0

sandeep Tomar,

Der Versuch, die bereits gezogen UIBezierPath von UIView zu entfernen, kann etwas umständlich sein, wenn auch durchaus möglich.

Aber ich glaube, die einfachste Lösung wäre es nicht zu entfernen versuchen, und es einfach unsichtbar machen :)

Angenommen, Sie zeichnen dann auf einer weißen Leinwand, wenn Sie die vorhandenen UIBezierPath entfernen möchten nur streicheln wieder, aber dieses mal mit weißer farbe :)

Sie können nie eine weiße Linie sehen, die auf weiße Leinwand gezeichnet wird ??? :)

[[UIColor whiteColor] setStroke]; 
[path stroke]; 

EDIT

Wenn Sie alles auf einen Schlag gelöscht werden soll, dann könnte dies Ihnen helfen :)

- (void)erase { 
    incrementalImage = nil; 
    path = nil; //Set current path nil 
    path = [UIBezierPath bezierPath]; 
    [self setNeedsDisplay]; 
} 

die Sie interessieren und Lemme wissen, wenn Sie noch Fragen haben. Hoffe, es hilft :)

+0

Danke für Ihre Antwort Herr, ich habe versucht, es zu implementieren –

+0

@ Sandeep-Tomar: Jedes Problem mit diesem Ansatz ??? Ja, die Anzahl der Segmente und die Länge der zu zeichnenden Segmente wird sich erhöhen, aber das müssen Sie sowieso handhaben, wenn Sie Zeichnungs- oder Signaturerfassungs-Apps entwickeln :) Ich habe bemerkt, dass Sie UIViews verwenden, UIViews sind teuer, versuchen Sie es mit CALayer, habe zwei Ebenen CALayer1, CALayer2, sobald der Benutzer sein Fingerbild anhebt, erzeuge das Bild und lege es unter die Ebene und lass die oberste Ebene die Berührung des Benutzers zeigen und es leicht halten :) Es gibt viele Tutorials :) Ich hatte eine App sowie im App Store mit der gleichen Technik. –

+0

ok Herr. Sir, können Sie eine Anleitung für diese Aufgabe geben? weil die obige Lösung immer noch nicht funktioniert. Ich bin hier stecken, um es auf Knopfdruck zu entfernen. –

0

dieses versuchen

- (void)erase { 

    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CGContextClearRect(context, self.bounds); 
} 
+0

ok Herr, halten Sie einfach eine Minute PLZ –

+0

nicht funktioniert bro –

Verwandte Themen