2010-11-30 10 views
7

Ich habe eine ziehbare Klasse, die UIImageView erbt. Der Mauszeiger funktioniert gut, wenn die Ansicht nicht animiert wird. Aber beim Animieren reagiert es nicht auf Berührungen. Sobald die Animation abgeschlossen ist, funktioniert die Berührung erneut. Aber ich brauche es, um die Animation bei Berührungen anzuhalten und fortzusetzen, wenn die Berührung endet. Ich verbrachte den ganzen Tag damit, es zu erforschen, konnte aber den Grund nicht herausfinden.UIView touchsbegan reagiert nicht während der Animation

Hier ist mein Animationscode.

[UIView animateWithDuration:5.0f 
    delay:0 
    options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction) 
    animations:^{ 
    self.center = CGPointMake(160,240); 
    self.transform = CGAffineTransformIdentity; 
    } 
    completion:nil 
]; 

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
    NSLog(@"touch"); 
    CGPoint pt = [[touches anyObject] locationInView:self]; 
    startLocation = pt; 
    [self.layer removeAllAnimations]; 
    [[self superview] bringSubviewToFront:self]; 
} 

Antwort

9

Das ist, weil ios Ihren belebenden Blick auf die Zielposition platziert, wenn die Animation beginnt, sondern zieht sie auf dem Weg. Wenn Sie also während der Bewegung auf die Ansicht tippen, tippen Sie tatsächlich außerhalb des Rahmens.

Setzen Sie in der Init Ihrer animierenden Ansicht userInteractionEnabled auf NO. Die Berührungsereignisse werden also von der Superview behandelt.

self.userInteractionEnabled = NO; 

Überprüfen Sie in der superview-Methode touchesBegan die Position der Präsentationsschicht Ihrer animierenden Ansicht. Wenn sie mit der Berührungsposition übereinstimmen, leiten Sie die Nachricht touchesBegan an diese Ansicht um.

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    CGPoint point = [[touches anyObject] locationInView:self.view]; 
    CGPoint presentationPosition = [[animatingView.layer presentationLayer] position]; 

    if (point.x > presentationPosition.x - 10 && point.x < presentationPosition.x + 10 
     && point.y > presentationPosition.y - 10 && point.y < presentationPosition.y + 10) { 
     [animatingView touchesBegan:touches withEvent:event]; 
    } 
} 
+0

Brilliant. Vielen Dank! – bzlm

+0

btw Ich hatte Probleme damit, auch wenn die Position nicht animiert, aber eine andere Eigenschaft ('frame' in meinem Fall) ist ... man bekommt immer noch Taps, die einfach verschluckt werden, obwohl der View' hitTest' und 'pointInside' Methoden werden korrekt aufgerufen und zurückgegeben. Außerdem mache ich nur 'if ([viewInside: point withEvent: event])' - keine Notwendigkeit für 10 Slop-Punkte – AlexChaffee

Verwandte Themen