ios 滑動返回的解決方案

三種方法:方法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)載、

1.iOS側(cè)滑返回三種實(shí)現(xiàn)方式及優(yōu)劣比較

2.iOS使其支持側(cè)滑返回

3.iOS之手勢滑動返回功能-b

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容