为了实现自己的设计风格,体现自己的特色,大部分公司都会采用完全定制导航栏以及导航栏上面的控件,这样除了容易控制也能更方便、更随意。那其实自定义导航栏是一把双刃剑,满足自己需求以外,你可能还会丢失一些东西,比如说,手势拖动返回上一层级,可能就会失效了,那么,又想自定义控件,还想实现拖动返回的效果,那该怎么做呢:
首先,要知道,iOS 7除了在传统的左上角添加返回键之外,还提供了右滑返回上一级界面的手势。他是UINavigationController新增的一个属性,因为所谓的拖动返回上一层级,其实就是进出栈。他是由导航控制器来实现的。而UINavigationController的这个属性就是interactivePopGestureRecognizer,即右滑返回只支持以UINavigationController为容器的ViewController间切换,要想在自定义容器中使用,还需要一些额外的工作。
1、一般的如果想控制ViewController是否启用右滑返回,只需要这样:不过此属性,默认就是YES
self.navigationController.interactivePopGestureRecognizer.enabled= YES;
2、如果你是自定义了返回按钮,那么拖动返回效果就是失效,那么可以这么做:在viewWillAppear中添加如下代码:
self.navigationController.interactivePopGestureRecognizer.delegate= self;
此时即可实现拖动返回的效果
3、但是此时你会发现一个问题:就是你在首页(跟视图)拖动返回的时候,你会发现,他并没有什么反应,此时,你再点击进入下一层级的话,会出现他并没有进入下一个界面,如果你此时进入后台,然后再重新进入前台的话,会发现他已经进入下一层级,其实,当你在首页拖动返回上一层级的时候,因为他是栈中的第一个,已经没有上一层级,所以在首页(跟视图)的时候,你需要禁用interactivePopGestureRecognizer的这个属性,设置成NO即可
那么你可以这么做:
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
if (self.navigationController.viewControllers.count == 1)//关闭主界面的右滑返回
{
return NO;
}else {
return YES;
}
}
这样,就不会出现上述问题了