全屏滑動(dòng)返回功能的實(shí)現(xiàn):
1. 實(shí)現(xiàn)邊緣滑動(dòng)返回
默認(rèn)導(dǎo)航控制器都是有滑動(dòng)返回功能,由于我們自定義了控制器的返回按鈕,把系統(tǒng)的返回按鈕覆蓋, 所以此功能失效了
為什么失效呢? 是不是把手勢干掉了
我們進(jìn)入 UINavigationController 搜索 Gesture
找到第一個(gè)手勢interactivePopGestureRecognizer
打印此手勢
NSLog(“%@“, self .interactivePopGestureRecognizer);
得到以下結(jié)果
<UIScreenEdgePanGestureRecognizer: 0x7fcf9bc7b3d0; state = Possible; delaysTouchesBegan = YES; view = <UILayoutContainerView 0x7fcf9bc6f120>;
target= <(action=handleNavigationTransition:,
target=<_UINavigationInteractiveTransition 0x7fcf9bc7afc0>)>>
所以手勢沒被干掉
并且
我們得到兩個(gè)信息: 該手勢的
target:UINavigationInteractiveTransition
action:handleNavigationTransition:
然后考慮是不是代理做了事情
看interactivePopGestureRecognizer手勢的代理,
就是這個(gè)UINavigationInteractiveTransition
我們把此手勢代理設(shè)置為nil , 發(fā)現(xiàn)可以實(shí)現(xiàn)滑動(dòng)返回
但是
在根控制器拖動(dòng)會(huì)發(fā)生死鎖 假死Bug
我們就把此手勢代理設(shè)置為導(dǎo)航控制器,
self.interactivePopGestureRecognizer.delegate = self;
并調(diào)用代理方法 gestureRecognizer shouldReceiveTouch 是否觸發(fā)手勢
控制只有非根控制器才會(huì)觸發(fā)手勢:
return self.childViewControllers.count > 1;
至此,就邊緣滑動(dòng)返回就完成了
2.實(shí)現(xiàn)全屏滑動(dòng)返回
在打印結(jié)果中, 進(jìn)入此手勢
UIScreenEdgePanGestureRecognizer
我們會(huì)發(fā)現(xiàn) 它 繼承自 UIPanGestureRecognizer
而且有一個(gè) UIRectEdge屬性, 進(jìn)去后發(fā)現(xiàn)它限定了邊緣
UIPan手勢是全屏的, 所以我們可以創(chuàng)建一個(gè)Pan手勢 ,
設(shè)置此手勢代理=self
然后把之前設(shè)置的代理注釋掉
//self.interactivePopGestureRecognizer.delegate = self;
讓Pan手勢調(diào)用 系統(tǒng)的滑動(dòng)返回方法該手勢的
target:UINavigationInteractiveTransition
action:handleNavigationTransition:
打印出的target就是interactivePopGestureRecognizer手勢的代理
我們用
id target =self.interactivePopGestureRecognizer.delegate
把它取出
這樣創(chuàng)建的Pan手勢就可以初始化調(diào)用系統(tǒng)的滑動(dòng)返回方法了
最后禁用系統(tǒng)的邊緣滑動(dòng)
self.interactivePopGestureRecognizer.enabled =NO;
做法來自@崢吖