Change animation transition

I have an application with NavigationController . How to change animation transition style pushViewController and popToViewController ?

UPD

I created a category, as in @lawicko's answer. But I got an error when I try to call a function

[self.navigationController pushViewController: places withCustomTransition: CustomViewAnimationTransitionPush subtype: CustomViewAnimationSubtypeFromLeft];

error: "use of undeclared identifier" CustomViewAnimationTransitionPush ""

Where should I declare this part:

 typedef enum { CustomViewAnimationTransitionNone, CustomViewAnimationTransitionFlipFromLeft, CustomViewAnimationTransitionFlipFromRight, CustomViewAnimationTransitionCurlUp, CustomViewAnimationTransitionCurlDown, CustomViewAnimationTransitionFadeIn, CustomViewAnimationTransitionMoveIn, CustomViewAnimationTransitionPush, CustomViewAnimationTransitionReveal } CustomViewAnimationTransition; 

Write now, I declare it in UINavigationController+Additions.h

UPD 2: Another new bug:

 Undefined symbols for architecture i386: "_OBJC_CLASS_$_CATransition", referenced from: objc-class-ref in UINavigationController+Additions.o "_kCATransition", referenced from: 

same errors as all _kCATransitions

+4
source share
3 answers

Check out this UINavigationController category that I created. This allows you to push and pop out in almost all possible transitions, and also supports subtypes for QuartzCore transitions that allow you to do exactly what you want - click on the left view. Do it like this:

 [self.navigationController pushViewController:[[MyController alloc] init] withCustomTransition:CustomViewAnimationTransitionPush subtype:CustomViewAnimationSubtypeFromLeft]; 

The code is below. The first part you need to add to the header:

 // IMPORTANT - basic transitions like flip and curl are local, they reside only in animation block. Core animations however, // once assigned to the layer, stay until changed or reset (by assigning nil as layer animation property) #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import <QuartzCore/QuartzCore.h> typedef enum { CustomViewAnimationTransitionNone, CustomViewAnimationTransitionFlipFromLeft, CustomViewAnimationTransitionFlipFromRight, CustomViewAnimationTransitionCurlUp, CustomViewAnimationTransitionCurlDown, CustomViewAnimationTransitionFadeIn, CustomViewAnimationTransitionMoveIn, CustomViewAnimationTransitionPush, CustomViewAnimationTransitionReveal } CustomViewAnimationTransition; #define CustomViewAnimationSubtypeFromRight kCATransitionFromRight #define CustomViewAnimationSubtypeFromLeft kCATransitionFromLeft #define CustomViewAnimationSubtypeFromTop kCATransitionFromTop #define CustomViewAnimationSubtypeFromBottom kCATransitionFromBottom @interface UINavigationController(Additions) - (void)pushViewController:(UIViewController *)viewController withCustomTransition:(CustomViewAnimationTransition)transition subtype:(NSString*)subtype; - (void)popViewControllerWithCustomTransition:(CustomViewAnimationTransition)transition subtype:(NSString*)subtype; - (void)popToRootViewControllerWithCustomTransition:(CustomViewAnimationTransition)transition subtype:(NSString*)subtype; - (void)popToViewController:(UIViewController *)viewController withCustomTransition:(CustomViewAnimationTransition)transition subtype:(NSString*)subtype; @end 

This is the second part that you need to add to the implementation file:

 #import "UINavigationController_Additions.h" @interface UINavigationController() - (void)standardAnimationWithController:(UIViewController*)viewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options changesBlock:(void (^)(void))block; - (void)coreAnimationWithController:(UIViewController*)viewController duration:(NSTimeInterval)duration type:(NSString*)type subtype:(NSString*)subtype changesBlock:(void (^)(void))block; @end @implementation UINavigationController(Additions) #pragma mark - #pragma mark pushing - (void)pushViewController:(UIViewController *)viewController withCustomTransition:(CustomViewAnimationTransition)transition subtype:(NSString*)subtype { switch (transition) { case CustomViewAnimationTransitionNone:{ [self standardAnimationWithController:viewController duration:.5 options:UIViewAnimationOptionTransitionNone changesBlock:^{ [self pushViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionFlipFromLeft:{ [self standardAnimationWithController:viewController duration:.5 options:UIViewAnimationOptionTransitionFlipFromLeft changesBlock:^{ [self pushViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionFlipFromRight:{ [self standardAnimationWithController:viewController duration:.5 options:UIViewAnimationOptionTransitionFlipFromRight changesBlock:^{ [self pushViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionCurlUp:{ [self standardAnimationWithController:viewController duration:.5 options:UIViewAnimationOptionTransitionCurlUp changesBlock:^{ [self pushViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionCurlDown:{ [self standardAnimationWithController:viewController duration:.5 options:UIViewAnimationOptionTransitionCurlDown changesBlock:^{ [self pushViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionFadeIn:{ [self coreAnimationWithController:viewController duration:.5 type:kCATransitionFade subtype:nil changesBlock:^{ [self pushViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionMoveIn:{ [self coreAnimationWithController:viewController duration:.5 type:kCATransitionMoveIn subtype:subtype changesBlock:^{ [self pushViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionPush:{ [self coreAnimationWithController:viewController duration:.5 type:kCATransitionPush subtype:subtype changesBlock:^{ [self pushViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionReveal:{ [self coreAnimationWithController:viewController duration:.5 type:kCATransitionReveal subtype:subtype changesBlock:^{ [self pushViewController:viewController animated:NO]; }]; break;} default:{ break;} } } #pragma mark - #pragma mark popping - (void)popViewControllerWithCustomTransition:(CustomViewAnimationTransition)transition subtype:(NSString*)subtype { switch (transition) { case CustomViewAnimationTransitionNone:{ [self standardAnimationWithController:nil duration:.5 options:UIViewAnimationOptionTransitionNone changesBlock:^{ [self popViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionFlipFromLeft:{ [self standardAnimationWithController:nil duration:.5 options:UIViewAnimationOptionTransitionFlipFromLeft changesBlock:^{ [self popViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionFlipFromRight:{ [self standardAnimationWithController:nil duration:.5 options:UIViewAnimationOptionTransitionFlipFromRight changesBlock:^{ [self popViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionCurlUp:{ [self standardAnimationWithController:nil duration:.5 options:UIViewAnimationOptionTransitionCurlUp changesBlock:^{ [self popViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionCurlDown:{ [self standardAnimationWithController:nil duration:.5 options:UIViewAnimationOptionTransitionCurlDown changesBlock:^{ [self popViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionFadeIn:{ [self coreAnimationWithController:nil duration:.5 type:kCATransitionFade subtype:nil changesBlock:^{ [self popViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionMoveIn:{ [self coreAnimationWithController:nil duration:.5 type:kCATransitionMoveIn subtype:subtype changesBlock:^{ [self popViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionPush:{ [self coreAnimationWithController:nil duration:.5 type:kCATransitionPush subtype:subtype changesBlock:^{ [self popViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionReveal:{ [self coreAnimationWithController:nil duration:.5 type:kCATransitionReveal subtype:subtype changesBlock:^{ [self popViewControllerAnimated:NO]; }]; break;} default:{ break;} } } - (void)popToRootViewControllerWithCustomTransition:(CustomViewAnimationTransition)transition subtype:(NSString*)subtype { switch (transition) { case CustomViewAnimationTransitionNone:{ [self standardAnimationWithController:nil duration:.5 options:UIViewAnimationOptionTransitionNone changesBlock:^{ [self popToRootViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionFlipFromLeft:{ [self standardAnimationWithController:nil duration:.5 options:UIViewAnimationOptionTransitionFlipFromLeft changesBlock:^{ [self popToRootViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionFlipFromRight:{ [self standardAnimationWithController:nil duration:.5 options:UIViewAnimationOptionTransitionFlipFromRight changesBlock:^{ [self popToRootViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionCurlUp:{ [self standardAnimationWithController:nil duration:.5 options:UIViewAnimationOptionTransitionCurlUp changesBlock:^{ [self popToRootViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionCurlDown:{ [self standardAnimationWithController:nil duration:.5 options:UIViewAnimationOptionTransitionCurlDown changesBlock:^{ [self popToRootViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionFadeIn:{ [self coreAnimationWithController:nil duration:.5 type:kCATransitionFade subtype:nil changesBlock:^{ [self popToRootViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionMoveIn:{ [self coreAnimationWithController:nil duration:.5 type:kCATransitionMoveIn subtype:subtype changesBlock:^{ [self popToRootViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionPush:{ [self coreAnimationWithController:nil duration:.5 type:kCATransitionPush subtype:subtype changesBlock:^{ [self popToRootViewControllerAnimated:NO]; }]; break;} case CustomViewAnimationTransitionReveal:{ [self coreAnimationWithController:nil duration:.5 type:kCATransitionReveal subtype:subtype changesBlock:^{ [self popToRootViewControllerAnimated:NO]; }]; break;} default:{ break;} } } - (void)popToViewController:(UIViewController *)viewController withCustomTransition:(CustomViewAnimationTransition)transition subtype:(NSString*)subtype { switch (transition) { case CustomViewAnimationTransitionNone:{ [self standardAnimationWithController:nil duration:.5 options:UIViewAnimationOptionTransitionNone changesBlock:^{ [self popToViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionFlipFromLeft:{ [self standardAnimationWithController:nil duration:.5 options:UIViewAnimationOptionTransitionFlipFromLeft changesBlock:^{ [self popToViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionFlipFromRight:{ [self standardAnimationWithController:nil duration:.5 options:UIViewAnimationOptionTransitionFlipFromRight changesBlock:^{ [self popToViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionCurlUp:{ [self standardAnimationWithController:nil duration:.5 options:UIViewAnimationOptionTransitionCurlUp changesBlock:^{ [self popToViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionCurlDown:{ [self standardAnimationWithController:nil duration:.5 options:UIViewAnimationOptionTransitionCurlDown changesBlock:^{ [self popToViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionFadeIn:{ [self coreAnimationWithController:nil duration:.5 type:kCATransitionFade subtype:nil changesBlock:^{ [self popToViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionMoveIn:{ [self coreAnimationWithController:nil duration:.5 type:kCATransitionMoveIn subtype:subtype changesBlock:^{ [self popToViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionPush:{ [self coreAnimationWithController:nil duration:.5 type:kCATransitionPush subtype:subtype changesBlock:^{ [self popToViewController:viewController animated:NO]; }]; break;} case CustomViewAnimationTransitionReveal:{ [self coreAnimationWithController:nil duration:.5 type:kCATransitionReveal subtype:subtype changesBlock:^{ [self popToViewController:viewController animated:NO]; }]; break;} default:{ break;} } } #pragma mark - #pragma mark private - (void)standardAnimationWithController:(UIViewController*)viewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options changesBlock:(void (^)(void))block { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:duration]; [UIView transitionWithView:self.view duration:duration options:options animations:block completion:NULL]; [UIView commitAnimations]; } - (void)coreAnimationWithController:(UIViewController*)viewController duration:(NSTimeInterval)duration type:(NSString*)type subtype:(NSString*)subtype changesBlock:(void (^)(void))block { CATransition* trans = [CATransition animation]; [trans setDuration:duration]; [trans setType:type]; [trans setSubtype:subtype]; [self.view.layer addAnimation:trans forKey:kCATransition]; block(); } @end 
+19
source

You need to add QuartzCore.framework to your goal to solve the _OBJC_CLASS_$_CATransition .

+2
source

I recently decided to create my own transition, a reusable library was used here:

https://github.com/travisjeffery/TRVSNavigationControllerTransition

And here is my blog post about how to make your own transition.

The basic idea is quite simple, just take a CALayer snapshot in the navigationController (current) view, then click / display the view without animation, take a CALayer snapshot of the new view, and then add your own animations to those layers and then delete these layers after the animation is complete.

0
source

Source: https://habr.com/ru/post/1398793/


All Articles