2016-05-20 5 views
4

Ich habe eine rechteckige Ansicht, die vertikale dünne Linien enthält, in denen ich programmatisch zeichnete.iOS - Wie zeichne Punkt auf einer Linie, in der der Benutzer beim Ziehen berührt

Dies ist der Code I verwendet, um die Linien zu zeichnen:

- (void)drawLines 
{ 
    CGFloat spacing = _bgView.frame.size.width/11.0f; 

    for(int i = 1; i < 11; i++) 
    { 
     UIView *line = [[UIView alloc] initWithFrame:CGRectMake((CGFloat)(i * spacing), 0, 1, _bgView.frame.size.height)]; 
     line.backgroundColor = [UIColor whiteColor]; 
     line.tag = i; 

     [_bgView addSubview:line]; 
    } 
} 

Die Linien, die durch gleichmäßig verteilte Räume von der Breite der rechteckigen Ansicht (_bgView) berechnet, getrennt sind.

Hier ist ein Überblick, was es sieht aus wie:

enter image description here

Wenn der Benutzer eine Drag in der rechteckigen Ansicht durchführt, und wenn seine/ihre Finger durchlaufen oder eine Linie berühren, wird ein Punkt sein, bezogen auf diesen spezifischen Punkt.

Hier ist der Code, der den Berührungspunkt des Benutzers auf der Linie erkennt und einen Punkt auf diesen Punkt zeichnet.

- (IBAction)drawDots:(id)sender 
{ 
    UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)sender; 

    CGPoint pannedPoint = [pan locationInView:_bgView]; 

    for (UIView *subview in _bgView.subviews) 
    { 
     if (CGRectContainsPoint(subview.frame, pannedPoint) && subview.tag > 0) 
     { 
      NSLog(@"Point x:%.2f y:%.2f TAG:%i", pannedPoint.x, pannedPoint.y, subview.tag); 

      UIView *point = [[UIView alloc] initWithFrame:CGRectMake(pannedPoint.x - 2.5, pannedPoint.y - 2.5, 5, 5)]; 
       point.backgroundColor = [UIColor redColor]; 

      [_bgView addSubview:point]; 
     } 
    } 
} 

, Nun, wenn der Benutzer Pfannen wirklich schnell, das wird das Ergebnis sein:

enter image description here

Wie nur einige Punkte gezogen gesehen werden, das ist, warum viele fehlt es Punkte auf den anderen Zeilen.

Dies sollte Ergebnis zu erwarten:

enter image description here

Aber diese super langsam nur, wenn der Benutzer Pfannen passiert.

Wie kann ich die Punkte in den Linien, die durch die Berührung des Benutzers abgefangen werden, selbst dann zeichnen, wenn sich sein Finger sehr schnell bewegt?

Danke!

+0

Sie Delegatmethode verwenden können es nennen, bevor Aktion der Schwenkbewegung –

+0

@PKT Danke! Ich werde es versuchen. –

+0

@PKT Hallo, ich möchte nur fragen, beziehen Sie sich auf UIGestureRecognizerDelegate?Wenn das der Fall ist, sehe ich keine Delegiertenmethode, die ich verwenden könnte. –

Antwort

1

Statt pan Gesten sollten Sie UIResponder Methoden verwenden, um Benutzer zu erkennen berührt:

- touchesBegan:withEvent: 
- touchesMoved:withEvent: 
- touchesEnded:withEvent: 
- touchesCancelled:withEvent: 

Die zweite Methode - touchesMoved: withevent: Anrufe, wenn der Benutzer hält seine Finger über den Bildschirm zu bewegen, so dass man seine Finger bekommen können Ort:

Dann fügen Sie einfach Ihre Erkennungslogik hinzu.

Überprüfen Sie die Dokumentation für weitere Informationen: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIResponder_Class/

+0

Dank sehen! Ich werde es versuchen. –

+0

Hallo, es funktioniert nicht so, wie ich es erwarte. Das Ergebnis ist das gleiche wie das, was ich jetzt sehe. –

1

bitte diesen Code verweisen

für Ihre Anforderung

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 

// NSLog(@"DEBUG: Touches moved"); 

[super touchesMoved:touches withEvent:event]; 

if ([[event allTouches] count] > 1) { 

} else { 

    UITouch *touch = [[event allTouches] anyObject]; 
    UIView *view = touch.view; 


    NSLog(@"DEBUG: Touches Moved"); 

    CGPoint location = [touch locationInView:self.bgView]; 
    for (UIView *subview in _bgView.subviews) 
    { 
     if (CGRectContainsPoint(subview.frame, location) && subview.tag > 0) { 

      NSLog(@"Point x:%.2f y:%.2f TAG:%i", location.x, location.y, subview.tag); 

      UIView *point = [[UIView alloc] initWithFrame:CGRectMake(location.x - 2.5, location.y - 2.5, 5, 5)]; 
      point.backgroundColor = [UIColor redColor]; 

      [_bgView addSubview:point]; 

     } 


    } 





    } 
} 

Wird Ihnen helfen,

+0

Für was ist das imageView? stellt das die Linien dar? –

+0

es ist nur Beispiel, ich bewege Bildansicht auf dem Bildschirm –

+0

Der Code funktioniert, aber immer noch es nicht anders als die, die ich schrieb. Wenn der Benutzer schnell zieht, können viele Punkte nicht erkannt werden. –