Ich habe in XCode einige Abwicklungssegmente erstellt und standardmäßig haben sie eine Animation, die ich nicht möchte. Nach einigem Suchen in Stack Overflow habe ich festgestellt, dass es ein Kontrollkästchen geben soll, das Sie deaktivieren können, um die Animation zu deaktivieren, aber das kommt in Xcode 7, auf das ich nicht upgraden kann. Wie würde ich die Abwicklungssequenz-Animation programmgesteuert deaktivieren? Ich laufe gerade XCode 6.4.iOS - Wie können Sie Animationen in Abwicklungssegmenten programmgesteuert deaktivieren?
Antwort
Lassen Sie uns Controller nennen, die Sie auf FirstController
abwickeln und die Sie SecondController
entlassen. Auch hier gibt es zwei Fälle: einen wenn SecondController
modal präsentiert wird und einen mit UINavigationController
beteiligt.
Unwind-Segment setzt/ignoriert modalPresentationStyle
, muss zwicken. In IBAction
Methode aufgerufen FirstController
beim Lesen der folgenden Abwickeln hinzufügen (ich nehme an, Sie diese Methode prepareForUnwind
genannt):
- (IBAction)prepareForUnwind:(UIStoryboardSegue *)segue {
//TODO: add right condition if you have to
UIViewController* secondController = (UIViewController*)segue.sourceViewController;
secondController.transitioningDelegate = self;
secondController.modalPresentationStyle = UIModalPresentationCustom;
}
Dieser Teil wird funktionieren, wenn SecondController
vom Sein modalen Feldes verwiesen. Nun, für Fall, wenn beide Controller befinden sich auf UINavigationController
sollte FirstController
seinem Delegierten werden:
- (void)viewDidLoad {
self.navigationController.delegate = self;
}
Dies wird UIKit machen FirstController
für nachfolgende Übergänge für Animator Objekt zu fragen. Jetzt sollten wir FirstController
ändern, um es zurückzugeben.
In FirstController.h
:
@interface FirstController : UIViewController<UIViewControllerTransitioningDelegate, UINavigationControllerDelegate>
Add Code FirstController.m
entspricht, so dass es einige Animator Objekt für beide Fälle zurückkehren würde (Geist kommentiert):
- (id <UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed
{
return [Animator new];
}
- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController *)fromVC
toViewController:(UIViewController *)toVC {
//This will disable ALL animations on particular UINavigationController
//return nil to use default animation when appropriate
return [Animator new];
}
Jetzt Animator
selbst implementieren. Es sollte UIViewControllerAnimatedTransitioning
Protokoll bestätigen.
In Animator.h
:
@interface Animator : NSObject<UIViewControllerAnimatedTransitioning>
@end
In Animator.m
:
@implementation Animator
- (NSTimeInterval)transitionDuration:(nullable id <UIViewControllerContextTransitioning>)transitionContext {
return 0;
}
- (void)animateTransition:(id <UIViewControllerContextTransitioning>)transitionContext {
UIViewController *controllerToDismiss = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIView *viewToDismiss = [transitionContext viewForKey:UITransitionContextFromViewKey];
CGRect frameToDismissTo = [transitionContext finalFrameForViewController:controllerToDismiss];
viewToDismiss.frame = frameToDismissTo;
UIViewController *controllerToPresent = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
UIView *viewToPresent = [transitionContext viewForKey:UITransitionContextToViewKey];
CGRect frameToPresentTo = [transitionContext finalFrameForViewController:controllerToPresent];
viewToPresent.frame = frameToPresentTo;
[[transitionContext containerView] addSubview:viewToPresent];
[transitionContext completeTransition:YES];
}
@end
Antwort basierend auf dieser post und dieser so answer (beide nicht von mir)