UIScrollView toucher des événements au cours de l'animation pas de tir avec animateWithDuration mais fonctionne très bien avec UIView beginAnimations:

StackOverflow https://stackoverflow.com/questions/3614116

Question

J'ai une sous-classe de UIScrollView que je défilement à l'aide d'animations programmation UIView.

Je voudrais l'utilisateur de pouvoir exploiter ou zoomer sur le contenu UIImageView de la vue défilement en l'animation se déroule.

Cela a bien fonctionné tout en utilisant une formulation semblable à ceci:

- (void) scrollSmoothlyatPixelsPerSecond:(float)thePixelsPerSecond {
    // distance in pixels / speed in pixels per second
    float animationDuration = _scrollView.contentSize.width / thePixelsPerSecond;

    [UIView beginAnimations:@"scrollAnimation" context:nil];
    [UIView setAnimationCurve: UIViewAnimationCurveLinear];
    [UIView setAnimationDuration:animationDuration];
    _scrollView.contentOffset = CGPointMake(_scrollView.contentSize.width, 0);
    [UIView commitAnimations];
}

Maintenant, depuis iOS 4.0, UIView beginAnimations: est découragée. J'ai donc essayé de mettre à jour mon code à l'aide d'un bloc et UIView animateWithDuration: Le défilement fonctionne de manière identique à ce qui précède.

La clé et la différence est que affolant pendant l'animation, le UIScrollView et d'autres vues sans plus répondre aux méthodes de gestion des événements:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

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

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; 

Il ne fait:

-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;

get appelé lorsque vous essayez de zoomer.

Modifier pour plus de clarté: Non présent UIView répond au toucher des événements. Ce ne se limite pas à la seule UIScrollView. Le poste de UIScrollView un UIToolbar ne répond pas à toucher les événements, ni faire d'autres boutons qui sont sous-vues d'un pair au UIScrollView. Il semble que l'ensemble UIView mère est gelé sur l'interaction utilisateur tandis que l'animation se passe . Encore une fois, après l'animation complète, tous les UIViews ci-dessus sont à nouveau sensibles.

Ils agissent tous s'appellent dans les UIView beginAnimations. Formulation quel que soit l'état d'animation

Mon animateWithDuration: le code est légèrement différent - mais les différences ne sont pas significatives. Dès que l'animation est terminée, les événements tactiles ci-dessus sont à nouveau appelés ...

voici mon code Animer:

- (void) scrollSmoothlyToSyncPoint:(SyncPoint *) theSyncPoint andContinue:(BOOL)theContinueFlag{

    float animationDuration = theSyncPoint.time - [player currentTime];
    [UIView animateWithDuration:animationDuration 
                          delay:0 
                        options:UIViewAnimationOptionCurveLinear 
                     animations:^{
        [_scrollView setContentOffset:theSyncPoint.contentOffset];
    } 
                     completion:^(BOOL finished){
                         if (theContinueFlag) {
                             SyncPoint *aSyncPoint = [self nextSyncPoint];
                             if (aSyncPoint) {
                                 [self scrollSmoothlyToSyncPoint:aSyncPoint andContinue:YES];
                             }
                         }
    }];
}

Le seul gestionnaire d'événements qui se déclenche au cours de la séquence d'animation ci-dessus est:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;

Alors, question: Dois-je - ne pas tenir compte d'Apple découragée étiquette et continuer à utiliser la formulation BeginAnimation? Dois-je - réimplémentez et mes autres zooming événements tactiles en utilisant hitTest? Y at-il une certaine connaissance de la différence dans la mise en œuvre entre les blocs d'animation qui peut me aider à faire face à ce problème? Y at-il quelque chose d'évident que je suis absent?

Je suis un nouveau développeur à Apple, et donc je ne sais pas comment sérieusement de prendre leur découragée balise. Mais si cette API sera dépréciée puis disparaître, je préfère déplacer dans une direction durable.

Merci beaucoup pour votre attention.

Était-ce utile?

La solution

Vous avez juste besoin d'inclure l'option UIViewAnimationOptionAllowUserInteraction lors de l'appel de l'animation comme ceci:

[UIView animateWithDuration:animationDuration 
                          delay:0 
                        options:(UIViewAnimationOptionCurveLinear | UIViewAnimationOptionAllowUserInteraction)
                     <snip>];

C'est une question sournoise, je sais! ;)

Re: La balise « Découragé » - En général, quand Apple vous dit de ne pas faire quelque chose en ce qui concerne la conception d'applications qui fonctionnent sur leurs plates-formes, il est généralement pour votre propre bien. Donc, vous avez raison de vouloir adopter des blocs d'animation au lieu de la façon clunky ancienne.

Autres conseils

La réponse de quickthyme est correcte. Voici l'extrait de Swift

Swift 4

UIView.animate(
    withDuration: 0.3, // specify animation duration here 
    delay: 0, // specify delay if needed 
    options: [
        UIView.AnimationOptions.allowUserInteraction, 
        UIView.AnimationOptions.curveLinear
    ], 
    animations: {
        // animations code    
    }
)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top