2014-03-26 9 views

Antwort

1

Wenn Sie über eine einfache UIView Animation zu einem gewissen Gestenerkenner verknüpft sprechen, würden Sie in der Regel nicht Animation während der Geste verwenden, sondern nur die Eigenschaften der Ansicht aktualisieren, wie Sie Updates als kontinuierliche Geste (zB UIPanGestureRecognizer) erhalten fortschreitet und nur dann eine traditionelle Animation anwenden, wenn Sie loslassen und die vom Benutzer initiierte Animation abschließen möchten. Sie müssen während der kontinuierlichen Bewegung keine Animation verwenden, da diese Ereignisse schnell genug eintreffen, um die Eigenschaften der Ansicht während der Geste problemlos zu ändern. Sie benötigen nur eine traditionelle Animation, wenn der Benutzer loslässt und Sie die Animation nahtlos zu ihrer logischen Schlussfolgerung fortsetzen möchten.

Alternativ, wenn Sie über den neuen iOS 7 View Controller-Übergang sprechen (ein etwas kompliziertes, sehr spezielles Szenario), richten Sie (a) ein Animator-Objekt ein (eines, das UIViewControllerAnimatedTransitioning entspricht); (b) Einrichten eines Interaktions-Controllers (der konform ist mit UIViewControllerInteractiveTransitioning, beispielsweise einem UIPercentDrivenInteractiveTransition); (c) Ihre Geste würde den percentComplete des Interaktionscontrollers aktualisieren; und (d) wenn die Geste beendet ist, rufen Sie entweder cancelInteractiveTransition oder finishInteractiveTransition auf der Grundlage Ihrer eigenen Logik an.

+0

Vielen Dank, das erklärt meine Situation im Grunde perfekt. Das Problem ist, dass ich eine Menge Probleme mit den ios7-Übergängen hatte, von denen ich überzeugt bin, dass sie von UIKit-Fehlern verursacht werden, und dass ich auch ios6 unterstützen muss, also versuche ich etwas ähnliches zu tun. – Chris

+0

Der einzige View-Controller-Transition-Bug, über den ich bisher gestolpert bin, ist ein seltsames Verhalten in Bezug auf Layout-Guides. Aber wenn Sie iOS 6 unterstützen, ist das egal, da Sie es über verschiedene Mechanismen erreichen müssten. Wenn Sie nur zwischen View-Controllern wischen, ist ein 'UIPageViewController' eine einfache Möglichkeit (wenn auch in Bezug auf die Animation eingeschränkt), zwischen View-Controllern in einer iOS 6-kompatiblen Weise zu wischen. Es hängt nur davon ab, für welche Art von Animation Sie drehen. – Rob

13

Ich denke, ich habe es. Unmittelbar nach dem [UIView belebtes ...] Block, gehen Sie wie folgt auf der Stammansicht:

_view.layer.speed = 0.0; 
_view.layer.timeOffset = [_view.layer convertTime:CACurrentMediaTime() fromLayer:nil]; 

Und auf der Skala den Punkt zu setzen, tun:

_view.layer.timeOffset = 0..1; (where 1 is the same value as the original duration) 

Und wieder aufnehmen, etwas ähnlich der folgenden:

CALayer *layer = _view.layer; 
CFTimeInterval pausedTime = [layer timeOffset]; 
layer.speed = 1.0; 
layer.timeOffset = 0.0; 
layer.beginTime = 0.0; 
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; 
layer.beginTime = timeSincePause; 

das alles hier ist: https://developer.apple.com/library/ios/qa/qa1673/_index.html

+0

Das funktioniert, aber gibt mir keine Möglichkeit, den Übergang in einer Weise abzubrechen, dass sein Abschlussblock immer noch aufgerufen wird. – Chris