2016-08-04 27 views
0

Also arbeite ich an einer iOS-App, die eine GUI hat, wo Sie auf ein Bild zeichnen können, Filter hinzufügen usw. Die Zeichnungsfunktion funktioniert, wird aber manchmal zufällig direkt am Anfang ausschneiden der Zeichnung. Wenn Sie auf dem Bildschirm anfangen zu zeichnen und es für mehr als eine halbe Sekunde funktioniert, wird es funktionieren, bis Sie es erneut versuchen; Aber manchmal, wenn Sie anfangen zu zeichnen, wird es nach einem Bruchteil einer Sekunde scheinbar ohne Grund ausschneiden.Drawing GUI wird manchmal ausschneiden

// Draws a line from point1 to point2 
- (void) drawOnImage:(CGPoint *)point1 :(CGPoint *)point2 { 
    UIGraphicsBeginImageContext(self.view.frame.size); 
    [self.mainImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), point1->x, point1->y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), point2->x, point2->y); 
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), brush); 
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), red, green, blue, 1.0); 
    CGContextSetBlendMode(UIGraphicsGetCurrentContext(),kCGBlendModeNormal); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    self.mainImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

} 

// Beginning of the drawing, only happens when you click but don't move around on the screen 
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    lastPoint = [touch locationInView:self.view]; 

    if (currentAction == DRAW) { 
     [self backupImage]; 

     //disable the renderImageView so that the gestures dont interfere 


     [self drawOnImage :&lastPoint :&lastPoint]; 
    } 
} 

// When lines are being drawn on the image (when your finger is moving) 
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
    if (currentAction == DRAW) { 
     UITouch *touch = [touches anyObject]; 
     CGPoint currentPoint = [touch locationInView:self.view]; 
     [self drawOnImage :&currentPoint :&lastPoint]; 
     lastPoint = currentPoint; 

    } 
} 

Hier ist mein Storyboard Layout; Wie Sie sehen, erzeugt der Code CGRects einer Linie, wenn der Benutzer zeichnet, und generiert dann das Hauptbild mit dem CGRect als Teil des Bildes neu.

storyboard

Hier ist ein Beispiel für die Ausgabe finden Sie die beiden schwarzen Zeichnung Markierungen, die sofort beendet? Der obere Zug arbeitete und folgte, die anderen beiden schnitten sofort aus und machten danach keine weiteren Linien mehr.

issue

Irgendwelche Ideen, warum dies geschieht? Zuerst dachten wir, es wäre der Simulator, aber es ist nicht.

+0

Ich sehe hier nichts, das das beschriebene Verhalten verursachen würde. Sicher, das ist wahrscheinlich nicht so effizient, wie es sein könnte, aber ich sehe keinen Grund dafür, es auszuschneiden. Ich würde vorschlagen, Logging-Nachrichten in einige dieser Routinen einzufügen, damit Sie sie eingrenzen können (empfängt sie überhaupt nicht die 'touchesMoved' oder ist sie in der Zeichnung). – Rob

+0

Hey, ich habe das Problem behoben. Ich bin mir nicht sicher, was es war, aber krank geben meine beste Idee in einem Beitrag unter –

+0

Ja, das Problem war nicht in dem Code in der Frage zur Verfügung gestellt. Ich habe es getestet und es hat gut funktioniert. Es muss etwas anderes gewesen sein (z. B. hat etwas "currentAction" auf etwas anderes als "DRAW" gesetzt, etwas, das die Hauptwarteschlange usw. blockiert). – Rob

Antwort

0

Das Problem bei der Behebung eines anderen Problems wurde behoben. Ich denke, ich hatte eine Verwirrung der Gestenerkennung (was eigentlich nicht passieren sollte, weil nur eine Geste gehen sollte, wenn sich die Berührung mit einem Finger bewegt), versuche, Gestenerkennerdelegierten auf die richtige Ansicht (normalerweise selbst) einzustellen, und wenn ja Die Funktion ist implementiert, sagen Sie, dass in bestimmten Situationen nur true zurückgegeben wird. Ich bezweifle jedoch, dass jemand genau dieses Problem haben wird, daher ist es wahrscheinlich nutzlos, diese Lösung zu veröffentlichen.