有时候我们需要
1、自定义navigationController push和pop界面切换动画
2、Push 、Pop 的时候更好的记录层次
那就试着对UINavigationController Category一下吧
💗Category的用途
在不创建继承类的情况下实现对已有类的扩展。
简化类的开发工作(当一个类需要多个程序员协同开发的时候,Category可以将同一个类根据用途分别放在不同的源文件中,从而便于程序员独立开发相应的方法集合)。
将常用的相关的方法分组。
关于push和pop界面切换动画
代码如下:
UINavigationController+Animation.h
#import <UIKit/UIKit.h>
@interface UINavigationController (Animation)
- (void)pushViewController:(UIViewController *)controller withTransition:(UIViewAnimationTransition)transition;
- (UIViewController *)popViewControllerWithTransition:(UIViewAnimationTransition)transition;
@end
UINavigationController+Animation.m
- (void)pushViewController:(UIViewController *)controller withTransition:(UIViewAnimationTransition)transition {
[UIView beginAnimations:nil context:NULL];
[self pushViewController:controller animated:NO];
[UIView setAnimationDuration:0.5];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationTransition:transition forView:self.view cache:YES];
[UIView commitAnimations];
}
- (UIViewController *)popViewControllerWithTransition:(UIViewAnimationTransition)transition {
[UIView beginAnimations:nil context:NULL];
UIViewController *controller = [self popViewControllerAnimated:NO];
[UIView setAnimationDuration:0.5];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationTransition:transition forView:self.view cache:YES];
[UIView commitAnimations];
return controller;
}
So easy!!
关于动画补充一下:
UIViewAnimationTransition
// UIViewAnimationTransitionNone 不使用动画
// UIViewAnimationTransitionFlipFromLeft 从左向右旋转翻页
// UIViewAnimationTransitionFlipFromRight 从右向左旋转翻页,与UIViewAnimationTransitionFlipFromLeft相反
// UIViewAnimationTransitionCurlUp 卷曲翻页,从下往上
// UIViewAnimationTransitionCurlDown 卷曲翻页,从上往下
如果需要更多自定义的动画效果,也可以自己自定义哦
效果:
关于Push 、Pop 的时候更好的记录层次
UINavigationController+NavManager
/**
* @brief 寻找Navigation中的某个viewcontroler对象
*
* @param className viewcontroler名称
*
* @return viewcontroler对象
*/
- (id)findViewController:(NSString*)className;
/**
* @brief 判断是否只有一个RootViewController
*
* @return 是否只有一个RootViewController
*/
- (BOOL)isOnlyContainRootViewController;
/**
* @brief RootViewController
*
* @return RootViewController
*/
- (UIViewController *)rootViewController;
/**
* @brief 返回指定的viewcontroler
*
* @param className 指定viewcontroler类名
* @param animated 是否动画
*
* @return pop之后的viewcontrolers
*/
- (NSArray *)popToViewControllerWithClassName:(NSString*)className animated:(BOOL)animated;
/**
* @brief pop n层
*
* @param level n层
* @param animated 是否动画
*
* @return pop之后的viewcontrolers
*/
- (NSArray *)popToViewControllerWithLevel:(NSInteger)level animated:(BOOL)animated;
我是写代码的凡,如有错误,欢迎指正!🙂🙂🙂