2016-05-17 15 views
0

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

0

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)