三種方法:方法1:系統(tǒng)自帶的側(cè)滑返回方法
2【8行代碼教你搞定導(dǎo)航控制器全屏滑動返回效果】 |那些人追的干貨
3:百度知道團(tuán)隊(duì)出品的全屏側(cè)滑返回(github地址)
方案一 :開啟使用系統(tǒng)自帶的側(cè)滑返回
iOS7之后系統(tǒng)提供了側(cè)滑手勢(interactivePopGestureRecognizer),即從屏幕左側(cè)邊緣滑起會pop回導(dǎo)航控制器棧的上個(gè)viewController。不過如果你自定義了UINavigationViewController或者自定義了返回按鈕,系統(tǒng)自帶的側(cè)滑返回功能會失效。此時(shí)需要添加下面的代碼解決:self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
缺點(diǎn):
?必須從屏幕邊緣左側(cè)滑起才會觸發(fā);
?一旦自定義導(dǎo)航控制器或者自定義返回按鈕,就會失效。
?優(yōu)點(diǎn):實(shí)現(xiàn)簡單,導(dǎo)航控制器中對全體viewController的側(cè)滑功能可控,系統(tǒng)API絕對安全可靠,無手勢沖突
?缺點(diǎn):側(cè)滑范圍局限于左側(cè)
?適用需求:只需左側(cè)小范圍觸發(fā)側(cè)滑時(shí)的首選實(shí)現(xiàn)方案。
?注:以上代碼是強(qiáng)制開啟,而系統(tǒng)的側(cè)滑是默認(rèn)開啟的,如果在某一界面 hidesBackButton,那么系統(tǒng)是禁止當(dāng)前界面的側(cè)滑返回。
?如果實(shí)現(xiàn)了以上代碼,屬于強(qiáng)制開啟,那么就算當(dāng)前界面hidesBackButton,側(cè)滑功能一樣開啟,通過上面的代理方法可以做到靈活控制哪個(gè)界面是否開啟側(cè)滑。方案二極其簡單取巧的方法iOS7之后是有側(cè)滑返回手勢功能的。注意,也就是說系統(tǒng)已經(jīng)定義了一種手勢,并且給這個(gè)手勢已經(jīng)添加了一個(gè)觸發(fā)方法(重點(diǎn))。但是,系統(tǒng)的這個(gè)手勢的觸發(fā)條件是必須從屏幕左邊緣開始滑動。我們?nèi)∏傻姆椒ㄊ亲约簩懸粋€(gè)支持全屏滑動的手勢,而其觸發(fā)方法系統(tǒng)已經(jīng)有,沒必要自己實(shí)現(xiàn)pop的動畫,所以直接就把系統(tǒng)的觸發(fā)處理方法作為我們自己定義的手勢的處理方法。#import "ViewController.h"@interface ViewController ()@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
id target = self.navigationController.interactivePopGestureRecognizer.delegate;
// handleNavigationTransition:為系統(tǒng)私有API,即系統(tǒng)自帶側(cè)滑手勢的回調(diào)方法,我們在自己的手勢上直接用它的回調(diào)方法
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
panGesture.delegate = self; // 設(shè)置手勢代理,攔截手勢觸發(fā)
[self.view addGestureRecognizer:panGesture];
// 一定要禁止系統(tǒng)自帶的滑動手勢
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
// 什么時(shí)候調(diào)用,每次觸發(fā)手勢之前都會詢問下代理方法,是否觸發(fā)
// 作用:攔截手勢觸發(fā)
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
// 當(dāng)當(dāng)前控制器是根控制器時(shí),不可以側(cè)滑返回,所以不能使其觸發(fā)手勢
if(self.navigationController.childViewControllers.count == 1)
{
return NO;
}
return YES;
}
@end
優(yōu)點(diǎn):最簡潔的全屏側(cè)滑實(shí)現(xiàn),導(dǎo)航控制器中對全體viewController的側(cè)滑功能可控
缺點(diǎn):從右邊忘左邊劃動也能觸發(fā)側(cè)滑操作,有手勢沖突,并不完美。且調(diào)用官方私有API
另外:正是缺點(diǎn)的所在,和Cell的側(cè)滑刪除手勢也是有沖突的,也就是說,免不了需要解決手勢的沖突。
適用需求:最好不用,畢竟缺點(diǎn)明顯。(不過這個(gè)實(shí)現(xiàn)思路,確實(shí)值得稱贊?。?/p>
方法三實(shí)現(xiàn)(集成最簡單、功能最全面):
去上面的鏈接地址下載DEMO,具體詳情見github
轉(zhuǎn)載、