在开发里,遇到了需要在导航栏里的返回按钮里做很多自定义的事情,比如说根据某个状态判断返回的是哪个页面
iOS导航栏中的返回按钮最多就改改样式啥的,但是无法获取点击事件,更别说修改了。。
收集了很多资料之后,终于在项目里实现了效果,于是下面就整理一下关于backButton的事,方便日后使用~
一、关于自定义的backButton
很多时候我们只需要去改变backButton的样式而不用做太多修改,这种情况下就简单的多了。
首先知道navigationBar上的按钮都是一种另外的按钮类,UIBarButtonItem,该类有几种常用的初始化方法:
1、图片:
- (instancetype)initWithImage:(nullable UIImage *)image style:(UIBarButtonItemStyle)style target:(nullable id)target action:(nullable SEL)action;
其实图片相关的有2种初始化方法。这种初始化方法可以把图片设置成按钮
2、附加文字
- (instancetype)initWithTitle:(nullable NSString *)title style:(UIBarButtonItemStyle)style target:(nullable id)target action:(nullable SEL)action;
3、系统自带样式的按钮
- (instancetype)initWithBarButtonSystemItem:(UIBarButtonSystemItem)systemItem target:(nullable id)target action:(nullable SEL)action;
4、利用当前已有的UIView来创建按钮
- (instancetype)initWithCustomView:(UIView *)customView;
通过选择合适的按钮初始化方式之后,便可以把它设置上去了。需要注意的是,把这些button设置上去后后边的selector指向的方法会被系统自带的返回方法所覆盖,所以无法用此方法修改返回按钮的事件
分两种情况:
1、保留箭头,但修改箭头右边的内容:
这种情况下只要设置:
navigatonController.navigationItem.backBarButtonItem = backButton;
2、直接修改箭头:
有的时候嫌箭头不好看,或者需要统一样式的时候,需要直接修改箭头。那么就需要以下方法:
[navVC.navigationBar setBackIndicatorImage:backImage];
[navVC.navigationBar setBackIndicatorTransitionMaskImage:backImage];
参数是一个UIImage,建议选择不要太复杂的简单颜色的图片
我选了一个白色的箭头然后发现系统会自动根据背景调整箭头的颜色,好评!
注:在Appdelegate中直接修改根视图的navigationController可以达到更换所有backButton的效果
二、需要自定义事件的返回按钮
很多时候,返回按钮需要自定义点击后的事件,或者获取点击事件,这种情况下直接修改backBarButtonItem是行不通的。
虽然大概可以通过runtime修改返回的方法。。但是更简单的可以把UIBarButtonItem设置成leftBarButtonItem,也是个不错的解决方法。
按钮的初始化方法和上面的相同,但是会发现单纯设置成lefrBarButtonItem的话会造成和原本的backBarButton对不齐的情况,这样就无法高仿了!
后来发现了这也是有解决方法的,如下:
UIImage *backImage = [UIImage imageNamed:@"newBackButton"];
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage: backImage style:UIBarButtonItemStylePlain target:self action:@selector(gotoMainPage)];
UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
negativeSpacer.width = -10;
self.navigationItem.leftBarButtonItems = @[negativeSpacer, backButton];