标签:
很多app的要求所有的返回按钮的title都是“返回”,如果上一层题目文字太多,下一层的返回按钮文字就会显示不完全,而且这样可以使软件显得整洁。
最普通的想法,A界面的navigationItem.backBarButtonItem修改的是B(A的下一级)界面的返回按钮,所以可以写一个BaseViewController,让所有的UIViewController继承它,像这样
1
|
- (void)viewDidLoad {
|
思路是:在开启程序时,使用Method Swizzling,将系统自带的backBarButtonItem方法替换成我们自定义的方法。
具体实现就是创建个 UINavigationItem + BackItem 的类别,当系统执行+load方法时,将backBarButtonItem方法和myCustomBackButton方法交换,利用iOS关联方法(objc_getAssociatedObject,objc_setAssociatedObject)在static区创建个backItemButton用来展示。这个方法的好处就是将类别导入到工程里不用任何代码就可以实现,上代码吧:
1
|
+(void)load{
|
最开始我的方案是实现UINavigationController的代理判断是否是栈底,如果不是就修改leftBarButtonItem的样式。
1
|
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
|
但iOS7.0出了之后,这并不是一个好的解决方案。因为iOS7.0之后如果把backItemButton替换成leftItemButon,interactivePopGestureRecognizer手势就没有了。虽然可以使用
1
|
self.navigationController.interactivePopGestureRecognizer.delegate = (id<UIGestureRecognizerDelegate>)self;
|
将手势再加上,但实在是有些麻烦。。可是很多大公司用的都是这个方法。
这个方法和上边‘替换返回按钮的文字’方法二大致一样,这句话要替换:
1
|
item = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back"] style:UIBarButtonItemStylePlain target:nil action:nil];
|
这句话要加上,用来去除系统自带的返回按钮上的尖脚号。
1
|
[[UINavigationBar appearance] setBackIndicatorImage:[[UIImage alloc]init]];
|
标签:
原文地址:http://www.cnblogs.com/ioshe/p/5481458.html