问题描述
我买了 NavigationController
的应用程序。我怎样才能改变的动画过渡风格 pushViewController
和 popToViewController
?
I got an app with NavigationController
. How can i change animation transition style of pushViewController
and popToViewController
?
UPD
我创建类像@lawicko答案。但我得到了,当我试图调用函数误差
I created category like in @lawicko answer. But i got error when i am trying to call function
[self.navigationController pushViewController:宿withCustomTransition:CustomViewAnimationTransitionPush亚型:CustomViewAnimationSubtypeFromLeft];
[self.navigationController pushViewController:places withCustomTransition:CustomViewAnimationTransitionPush subtype:CustomViewAnimationSubtypeFromLeft];
错误是:使用未声明的标识符CustomViewAnimationTransitionPush的
error is : "use of undeclared identifier 'CustomViewAnimationTransitionPush'"
我应该在哪里宣布这一部分:
Where should i declare this part:
typedef enum {
CustomViewAnimationTransitionNone,
CustomViewAnimationTransitionFlipFromLeft,
CustomViewAnimationTransitionFlipFromRight,
CustomViewAnimationTransitionCurlUp,
CustomViewAnimationTransitionCurlDown,
CustomViewAnimationTransitionFadeIn,
CustomViewAnimationTransitionMoveIn,
CustomViewAnimationTransitionPush,
CustomViewAnimationTransitionReveal
} CustomViewAnimationTransition;
现在写我宣布它的UINavigationController + Additions.h
2 UPD:还有一个新的错误:
UPD 2: One more new error:
Undefined symbols for architecture i386:
"_OBJC_CLASS_$_CATransition", referenced from:
objc-class-ref in UINavigationController+Additions.o
"_kCATransition", referenced from:
和同样的错误福尔所有_kCATransitions
and same errors foor all _kCATransitions
推荐答案
检查出我创造了这个的UINavigationController
类别。它可以让你推和pretty弹出多每一个可能的过渡,并且还支持QuartzCore过渡亚型,这将让你做你想要什么 - 从推左视图。像这样做:
Check out this UINavigationController
category that I created. It allows you pushing and popping with pretty much every possible transition, and also supports subtypes for QuartzCore transitions, which will allow you to do exactly what you want - push the view from the left. Do it like this:
[self.navigationController pushViewController:[[MyController alloc] init] withCustomTransition:CustomViewAnimationTransitionPush subtype:CustomViewAnimationSubtypeFromLeft];
在code如下。第一部分,你需要把在标题部分:
The code is below. The first part you need to put in the header part:
// 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 second part you need to put in 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
这篇关于更改动画过渡的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!