UIScrollView touch-Ereignisse während der animation nicht auslösen mit animateWithDuration: aber funktionieren mit UIView beginAnimations:

Ich habe eine UIScrollView Unterklasse, ich bin programmatisch scrollen mit UIView-Animationen.

Ich würde gerne die Benutzer werden in der Lage zu Tippen oder Zoomen Sie in das UIImageView Inhalt des Scroll-View während die animation stattfindet.

Das hat geklappt, zwar mit einer Formulierung ähnlich dieser:

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

Nun, seit iOS 4.0, UIView beginAnimations: wird abgeraten. Also habe ich versucht, zu aktualisieren, meinen code mit einem block und UIView animateWithDuration: Das scrollen funktioniert gleich wie die oben genannten.

Den Schlüssel und unerträglicher Unterschied ist, dass während der animation, der UIScrollView und andere Ansichten nicht mehr reagieren event-handling Methoden:

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

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

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

Noch nicht :

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

aufgerufen werden, wenn Sie versuchen, um zu Zoomen.

Bearbeiten für Klarheit : Keine UIView Gegenwart reagiert auf touch-Ereignisse. Das beschränkt sich nicht nur auf die UIScrollView. Das UIScrollView ist peer ein UIToolbar reagiert nicht auf touch-events, noch andere Tasten, die Untersichten von einem peer zu dem UIScrollView. Es scheint, dass die gesamte Eltern-UIView eingefroren ist die Interaktion mit dem Benutzer während der animation wird auf. Wieder, nachdem die animation beendet ist, alle der oben genannten UIViews sind wieder ansprechbar.

Diese alle aufgerufen in die UIView beginAnimations: Formulierung unabhängig von Zustand animation.

Meine animateWithDuration: code ist etwas anders - aber die Unterschiede sind nicht wesentlich. Sobald die animation abgeschlossen ist, die oben genannten touch-events sind wieder aufgerufen...

hier mein animieren code:

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

Nur event-handler, der ausgelöst wird, während die obige animation block:

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

So, Frage: Sollte ich ignorieren die Apple entmutigt label und weiterhin die beginAnimation Formulierung? Sollte ich implementieren Zoomen und meine andere touch-basierte Ereignisse, die mit hitTest? Da ist eine gewisse Kenntnis der Unterschied in der Umsetzung zwischen animation Blöcke, die mir helfen können konfrontieren dieses problem? Gibt es etwas offensichtlich, dass ich bin fehlt?

Ich bin ein neuer Entwickler an Apple, also ich weiß nicht, wie ernst zu nehmen Ihre entmutigt tag. Aber wenn diese API als veraltet gelten dann verschwinden, ich würde eher bewegen in eine nachhaltige Richtung.

vielen Dank für Ihre Aufmerksamkeit.

  • Diese Bedingung wäre wirklich erscheinen werden aufgefordert, durch eine low-memory-situation. Ich habe nicht die Zeit, umfassend zu testen, ob dies tatsächlich die Ursache ist (deshalb hatte ich die Frage nicht beantworten noch). Aber, nach der Erfahrung mit ähnlichen Aussetzung des event-handling bei der low-memory-Situationen, ist es wirklich scheint, dass ist, was passiert. Nun - warum sollte die block-basierte animation beeinflusst werden, in der Erwägung, dass der andere nicht... ich werde eine umfassende testen, wenn ich Zeit und post.
InformationsquelleAutor Jackifus | 2010-09-01
Schreibe einen Kommentar