UIScrollView Touch-Ereignisse während der Animation nicht mit animateWithDuration Brennen: aber die Arbeit gut mit UIView beginAnimations:

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

Frage

Ich habe eine UIScrollView Unterklasse, dass ich programmatisch verschiebe UIView Animationen verwenden.

würde ich den Benutzer möchte in der Lage sein zu tippen oder zoomen in die UIImageView Inhalt der Scroll-Ansicht , während die Animation stattfindet.

Das hat hat gut funktioniert, während eine Formulierung mit ähnlich folgt aus:

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

Jetzt, da iOS 4.0, UIView beginAnimations: abgeraten. Also habe ich versucht, meinen Code mit einem Block und UIView animateWithDuration zu aktualisieren: Das Scrollen funktioniert identisch wie oben.

Der Schlüssel und aufreizend Unterschied ist, dass während der Animation, die UIScrollView und andere Ansichten nichtmehr reagieren auf Ereignisbehandlungsmethode:

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

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

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

Auch nicht:

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

aufgerufen werden, wenn es zu vergrößern versuchen.

Bearbeiten für Klarheit: Nein UIView vorhanden reagiert Ereignisse zu berühren. Dies wird nicht nur auf die UIScrollView beschränkt. Die UIScrollView Peer ein UIToolbar reagiert nicht auf Berührungsereignisse, noch andere Tasten, die Subviews eines Peer zum UIScrollView sind. Es scheint, dass die gesamte Mutter UIView aus Interaktion mit dem Benutzer ausgefroren , während die Animation auf geht. Auch nachdem die Animation abgeschlossen ist, sind alle oben genannten UIViews wieder ansprechbar.

Sie diese alle in dem UIView beginAnimations aufgerufen. Formulierung unabhängig von Animation Zustand

Meine animateWithDuration: Code ist etwas anders - aber die Unterschiede sind nicht wesentlich. Sobald die Animation abgeschlossen ist, werden die oben genannten Touch-Ereignisse wieder genannt ...

hier ist mein belebtes 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];
                             }
                         }
    }];
}

Die einzigen Event-Handler, der ausgelöst wird während des obigen Animation Blockes ist:

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

Also, Frage: Soll ich - ignorieren Apples entmutigt Label und auch weiterhin die Formulierung Beginanimation benutzen? Should I - reimplementieren Zoomen und meine anderen berührungsbasierte Ereignisse mit hitTest? Gibt es irgendeine Kenntnis der Unterschied bei der Umsetzung zwischen Animationsblöcken, die mir zu begegnen diesem Problem helfen? Gibt es etwas offensichtlich, dass ich fehle?

Ich bin ein neuer Entwickler von Apple, und so weiß ich nicht, wie ernst ihren entmutigt nehmen Tag. Aber wenn dieser API veraltet wird dann verschwinden, würde ich eher in einer dauerhaften Richtung bewegen.

Vielen Dank für Ihre Aufmerksamkeit.

War es hilfreich?

Lösung

Sie müssen nur die UIViewAnimationOptionAllowUserInteraction Option, um beim Aufruf der Animation wie folgt:

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

Das ist ein hinterhältiger ein, ich weiß! ;)

Re: Der „Discouraged“ tag - Im Allgemeinen, als Apple sagt Ihnen nicht etwas in Bezug auf tun Anwendungen gestalten, dass Run auf ihre Plattformen, ist es in der Regel für Ihre eigenen gut. So können Sie direkt zu wollen sind Animationsblöcke statt der klobigen alten Art und Weise übernehmen.

Andere Tipps

quickthyme Antwort ist richtig. Hier ist der Code-Schnipsel in 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    
    }
)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top