2010-11-30 6 views
7

J'ai une classe draggable qui hérite de UIImageView. Le glisser fonctionne bien lorsque la vue n'est pas animée. Mais en l'animant, il ne répondra pas aux touches. Une fois l'animation terminée, le toucher fonctionne à nouveau. Mais j'en ai besoin pour mettre en pause l'animation sur les touches et reprendre quand le toucher se termine. J'ai passé toute la journée à faire des recherches mais je n'ai pas compris la raison.UIView touchesbegan ne répond pas pendant l'animation

Voici mon code d'animation.

[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]; 
} 

Répondre

9

C'est parce que ios place votre vue animant à la position cible, lorsque l'animation démarre, mais il tire sur le chemin. Donc, si vous appuyez sur la vue tout en se déplaçant, vous appuyez réellement quelque part hors de son cadre.

Dans l'init de votre vue d'animation, définissez userInteractionEnabled sur NO. Les événements tactiles sont donc gérés par la vue d'ensemble.

self.userInteractionEnabled = NO; 

Dans la méthode touchesBegan de votre super-vue, vérifiez la position de présentation de votre vue animée. S'ils correspondent à la position tactile, redirigez le message touchesBegan vers cette vue.

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

Brillant. Merci! – bzlm

+0

btw J'ai eu des problèmes avec ça même si la position n'est pas animée, mais une autre propriété ('frame' dans mon cas) est ... vous obtenez toujours des taps qui sont simplement engloutis, même si la vue' hitTest' et Les méthodes 'pointInside' sont appelées et retournent correctement. Aussi, je fais juste 'if ([voir pointInside: point avecEvent: event])' - pas besoin de 10 points de slop – AlexChaffee