我们在开发过程中总是会有很多情况下,需要自定义返回按钮的样式,然而我所看到的,在iOS中自定义返回按钮有下面两种方式(欢迎大家来补充)
第一种:改变navigationItem的backBarButtonItem为自定义按钮
self.navigationItem.backBarButtonItem = customBarItem ;
但是我发现这样设置并没有效果,显示的还是原来系统自带的返回按钮
这里如果大家知道是为什么,可以让我学习学习.
第二种:设置navigationItem的leftBarButtonItem为自定义按钮
self.navigationItem.leftBarButtonItem = customBarItem ;
这种的方式,想要自定义返回按钮的目的就能够达到了
但是
这样设置了之后,iOS自带的左滑返回的功能就莫名其妙了没有了呀!这时候产品就会各种吐槽了.所以到现在就有一个问题了,怎样才能够,既满足美工的需求,也满足产品的需求呢.
先说说我一开始是怎么做的.
1.我在UIViewController的Category中写了一个方法,用来自定义返回按钮.有人可能会问,为什么要写在Category中,不写在父类中,直接继承过来就好.我个人是认为Category的耦合性远比父类要低.至于好处,相信各位攻城狮都知道.
代码贴出来:
//左侧返回的按钮
UIButton* leftButton = [UIButtonbuttonWithType:UIButtonTypeCustom] ;
leftButton.frame=CGRectMake(0,0,30,30) ;
[leftButtonsetContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft] ;
[leftButtonsetImage:[UIImageimageNamed:@"nav_back_hlighted"]forState:UIControlStateHighlighted] ;[leftButtonsetImage:[UIImageimageNamed:@"nav_back_hlighted"]forState:UIControlStateSelected] ;
[leftButton addTarget:selfaction:selectorforControlEvents:UIControlEventTouchUpInside] ;
[leftButtonsetImage:[UIImageimageNamed:@"nav_fh"]forState:UIControlStateNormal] ;
CGFloatnavPadding =QM_NAVITEMPADDING;
UIBarButtonItem* leftBarItem = [[UIBarButtonItemalloc]initWithCustomView:leftButton] ;
self.navigationItem.leftBarButtonItem= leftBarItem ;
// 设置返回的手势为可用状态
self.navigationController.interactivePopGestureRecognizer.enabled=YES;
2.上面这段代码,我是在viewDidLoad里面调用的,只是改变了返回按钮的样式,但是左滑返回的手势并不起作用.
我又在网上找了一些文章,有个文章是说要将返回手势的delegate给现在的控制器
参考链接:http://blog.csdn.net/wmqi10/article/details/16850479
3.于是我又在上面的代码最后增加了代理,并且还是在Category中实现了gestureRecognizerShouldBegin方法,隐式遵循代理是可行的,但是我也不知道坏处是什么...
结果就是,在上面那段代码最后增加
self.navigationController.interactivePopGestureRecognizer.delegate=self;
然后实现gestureRecognizerShouldBegin代理方法:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer{
if(self.navigationController.viewControllers.count ==1){
//关闭主界面的右滑返回
returnNO;
}else {
returnYES;
}
}
这样左滑的手势就有作用了