導(dǎo)航控制器全屏滑動(dòng)返回效果

導(dǎo)航控制器默認(rèn)自帶了側(cè)滑功能,當(dāng)用戶在界面的左邊滑動(dòng)的時(shí)候,就會(huì)有側(cè)滑功能。但是如何實(shí)現(xiàn)全屏滑動(dòng)返回效果?

分析:

第一步分析:

1.導(dǎo)航控制器的view自帶了滑動(dòng)手勢,只不過手勢的觸發(fā)范圍只能在左邊。
2.當(dāng)用戶在界面左邊拖動(dòng),就會(huì)觸發(fā)滑動(dòng)手勢方法,并且有滑動(dòng)返回功能,說明系統(tǒng)手勢觸發(fā)的方法已經(jīng)實(shí)現(xiàn)了滑動(dòng)返回功能。
3.為什么說系統(tǒng)手勢觸發(fā)的方法已經(jīng)實(shí)現(xiàn)了滑動(dòng)返回功能?
原因:
創(chuàng)建滑動(dòng)手勢對象的時(shí)候,需要綁定監(jiān)聽者,當(dāng)觸發(fā)手勢的時(shí)候會(huì)調(diào)用target的action。

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:action];

當(dāng)用戶在界面左邊滑動(dòng),有滑動(dòng)返回功能,這是因?yàn)橛|發(fā)手勢了,調(diào)用target的action方法,說明action方法內(nèi)部實(shí)現(xiàn)滑動(dòng)返回功能,否則就不會(huì)有滑動(dòng)返回效果。

第二步分析:

打印導(dǎo)航控制器自帶的滑動(dòng)手勢:

NSLog(@"%@",self.interactivePopGestureRecognizer);

得到: <UIScreenEdgePanGestureRecognizer: 0x7fe243d29150; state = Possible; delaysTouchesBegan = YES; view = <UILayoutContainerView 0x7fe243d28d90>; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7fe243d27b30>)>>
可知:
1.系統(tǒng)自帶的手勢是UIScreenEdgePanGestureRecognizer類型對象,屏幕邊緣滑動(dòng)手勢
2.系統(tǒng)自帶手勢target是_UINavigationInteractiveTransition類型的對象
3.target調(diào)用的action方法名叫handleNavigationTransition:
UIScreenEdgePanGestureRecognizer,看名稱就知道,這個(gè)手勢的范圍只能在屏幕的周邊,就是因?yàn)檫@個(gè)手勢,系統(tǒng)自帶的滑動(dòng)效果,只能實(shí)現(xiàn)側(cè)邊滑動(dòng)。

第三步分析:

現(xiàn)在只差target, _UINavigationInteractiveTransition 真實(shí)類型
通過打印系統(tǒng)自帶的滑動(dòng)手勢的代理,發(fā)現(xiàn)正好是_UINavigationInteractiveTransition對象,因此可猜測這個(gè)代理對象就是target對象,只要拿到它,就拿到系統(tǒng)自帶滑動(dòng)手勢的target對象。

// 打印系統(tǒng)自帶滑動(dòng)手勢的代理對象 
NSLog(@"%@",self.interactivePopGestureRecognizer.delegate);

得到:<_UINavigationInteractiveTransition: 0x7ffabb732cb0>
實(shí)現(xiàn)代碼:
導(dǎo)航控制器全屏滑動(dòng)注意點(diǎn):
1.禁止系統(tǒng)自帶滑動(dòng)手勢使用。
2.只有導(dǎo)航控制器的非根控制器才需要觸發(fā)手勢,使用手勢代理,控制手勢觸發(fā)。

- (void)viewDidLoad{ 
   [super viewDidLoad];
   // 獲取系統(tǒng)自帶滑動(dòng)手勢的target對象
    id target = self.interactivePopGestureRecognizer.delegate;
   // 一定要記住禁止系統(tǒng)的手勢
    self.interactivePopGestureRecognizer.enabled = NO; 
   //添加自己的全屏滑動(dòng)手勢 
   UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
 [self.view addGestureRecognizer:pan]; 
   // 當(dāng)是根控制器的時(shí)候禁止手勢, 當(dāng)不是根控制器的時(shí)候打開手勢 
   // 設(shè)置手勢代理,攔截手勢觸發(fā),當(dāng)手勢開始滑動(dòng)的時(shí)候就判斷 
   pan.delegate = self;
}
#pragma mark -UIGestureRecognizerDelegate
//當(dāng)手勢開始滑動(dòng)作用:攔截手勢觸發(fā)
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{ 
   //子控制器個(gè)數(shù)只剩下一個(gè)(這一個(gè)就是根控制器),手勢不可用 
   BOOL open = self.childViewControllers.count != 1; 
   return open;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

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