iOS開發之自定義導航欄返回按鈕右滑返回手勢失效的解決

本文簡介

見題知意 不再加以解釋

我相信針對每一個iOS開發者來說~除了根視圖控制器外~所有的界面通過導航欄push過去的界面都是可以通過右滑來返回上一個界面~其實~在很多應用和APP中~用戶已經習慣了這個功能~然而~作為開發者的我們~也并沒有為此做些什么~因為我們在創建項目時~蘋果公司已經為我們都做好了~那么~我們這期就來聊一聊這系統自帶的右滑方法以及如何修改和攔截這個不被重視的方法~

什么時候會被攔截

當我們使用代碼或者用storyboard來創建一個新的控制器的時候~我們很少注意導航欄的leftItem~因為正常情況下~push到下一個界面的leftItem就是上一個界面的self.title~并且它也就是一個返回的功能~所以~我們很少去在意這些~但當我們有些需求~需要自定義leftItem的時候~那么問題就來了~

問題一:怎么自定義leftItem

問題二:為什么系統自帶的右滑返回手勢失效

問題三:怎么解決這個失效問題

1.怎么自定義leftItem

其實~這個東西嘛~說簡單也是很簡單的~因為~我們很明確的知道~左導航欄就一個功能~那就是返回上一個界面~很顯然~是需要用戶交互的~必用按鈕~

說多了都是廢話~直接上代碼~

//自定義一個按鈕

UIButton? *leftBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [leftBtn setTitle:@"返回" forState:UIControlStateNormal];

[leftBtn addTarget:self action:@selector(backLastView) forControlEvents:UIControlEventTouchUpInside];

leftBtn.frame = CGRectMake(0, 0, 60, 40);

[leftBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

//將leftItem設置為自定義按鈕

UIBarButtonItem? *leftItem =[[UIBarButtonItem alloc]initWithCustomView: leftBtn];

self.navigationItem.leftBarButtonItem = leftItem;

//按鈕點擊事件 返回上一個界面

- (void)backLastView{

[self.navigationController popViewControllerAnimated:YES];

}

需要注意的是~xcode自動從6.0之后~leftItem距左屏幕邊距有16個像素點~這樣會導致在視覺上會感覺有點偏右~不算美觀~然而對于大多數處女座的程序員來說~這明顯是不能讓人去接受的~解決辦法有很多~在這里提供一個最為方便的方法~設置一下按鈕的contentEdgeInsets(文字)imageEdgeInsets(圖片)屬性即可~如:leftButton.contentEdgeInsets = UIEdgeInsetsMake(0, -16, 0, 0);

2.為什么系統自帶的右滑返回手勢失效

這也是我一直所關系的問題~還希望知道的可以私信我~

笨笨編程官方微博

[http://weibo.com/2728581591/profile?rightmod=1&wvr=6&mod=personnumber]

qq:2638006336

3.怎么解決這個失效問題

其實很簡單很簡單~只需要添加下面這一句代碼即可

self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;

由于根視圖控制器是不需要具備左側滑返回功能,如果在根控制器滑動,會有導致界面無法再滑動的bug;

只需禁用即可。解決方案:需在右滑返回根視圖控制器的VC中添加以下方法。

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{

if (self.childViewControllers.count == 1) {

// 表示用戶在根控制器界面,就不需要觸發滑動手勢,

return NO;

}

return YES;

}


其實到這里~問題應該都解決了~但是~畢竟右滑返回手勢只能靠近屏幕左邊緣才能使用~我們如何通過調用系統方法來實現在整個屏幕右滑就可以實現返回功能呢~

setp1:需要獲取系統自帶滑動手勢的target對象

id target = self.navigationController.interactivePopGestureRecognizer.delegate;

setp2:創建全屏滑動手勢~調用系統自帶滑動手勢的target的action方法

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];

step3:設置手勢代理~攔截手勢觸發

pan.delegate = self;

step4:別忘了~給導航控制器的view添加全屏滑動手勢

[self.view addGestureRecognizer:pan];

step5:將系統自帶的滑動手勢禁用

self.navigationController.interactivePopGestureRecognizer.enabled = NO;

steo6:還記得剛剛設置的代理嗎?下面方法什么時候調用?在每次觸發手勢之前都會詢問下代理,是否觸發。

這個方法就是攔截手勢觸發的方法.

- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{}

return NO;則不需要觸發滑動手勢

return YES;則需要觸發滑動手勢


轉載 -- http://www.lxweimin.com/p/78fc64d387ec

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容