本文簡介
見題知意 不再加以解釋
我相信針對每一個iOS開發(fā)者來說~除了根視圖控制器外~所有的界面通過導航欄push過去的界面都是可以通過右滑來返回上一個界面~其實~在很多應用和APP中~用戶已經(jīng)習慣了這個功能~然而~作為開發(fā)者的我們~也并沒有為此做些什么~因為我們在創(chuàng)建項目時~蘋果公司已經(jīng)為我們都做好了~那么~我們這期就來聊一聊這系統(tǒng)自帶的右滑方法以及如何修改和攔截這個不被重視的方法~
什么時候會被攔截
當我們使用代碼或者用storyboard來創(chuàng)建一個新的控制器的時候~我們很少注意導航欄的leftItem~因為正常情況下~push到下一個界面的leftItem就是上一個界面的self.title~并且它也就是一個返回的功能~所以~我們很少去在意這些~但當我們有些需求~需要自定義leftItem的時候~那么問題就來了~
問題一:怎么自定義leftItem
問題二:為什么系統(tǒng)自帶的右滑返回手勢失效
問題三:怎么解決這個失效問題
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設(shè)置為自定義按鈕
UIBarButtonItem? *leftItem =[[UIBarButtonItem alloc]initWithCustomView: leftBtn];
self.navigationItem.leftBarButtonItem = leftItem;
//按鈕點擊事件 返回上一個界面
- (void)backLastView{
[self.navigationController popViewControllerAnimated:YES];
}
需要注意的是~xcode自動從6.0之后~leftItem距左屏幕邊距有16個像素點~這樣會導致在視覺上會感覺有點偏右~不算美觀~然而對于大多數(shù)處女座的程序員來說~這明顯是不能讓人去接受的~解決辦法有很多~在這里提供一個最為方便的方法~設(shè)置一下按鈕的contentEdgeInsets(文字)imageEdgeInsets(圖片)屬性即可~如:leftButton.contentEdgeInsets = UIEdgeInsetsMake(0, -16, 0, 0);
2.為什么系統(tǒng)自帶的右滑返回手勢失效
這也是我一直所關(guān)系的問題~還希望知道的可以私信我~
笨笨編程官方微博
[http://weibo.com/2728581591/profile?rightmod=1&wvr=6&mod=personnumber]
qq:2638006336
3.怎么解決這個失效問題
其實很簡單很簡單~只需要添加下面這一句代碼即可
self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
由于根視圖控制器是不需要具備左側(cè)滑返回功能陷遮,如果在根控制器滑動,會有導致界面無法再滑動的bug篙骡;
只需禁用即可还棱。解決方案:需在右滑返回根視圖控制器的VC中添加以下方法蝶桶。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
if (self.childViewControllers.count == 1) {
// 表示用戶在根控制器界面耍贾,就不需要觸發(fā)滑動手勢,
return NO;
}
return YES;
}
其實到這里~問題應該都解決了~但是~畢竟右滑返回手勢只能靠近屏幕左邊緣才能使用~我們?nèi)绾瓮ㄟ^調(diào)用系統(tǒng)方法來實現(xiàn)在整個屏幕右滑就可以實現(xiàn)返回功能呢~
setp1:需要獲取系統(tǒng)自帶滑動手勢的target對象
id target = self.navigationController.interactivePopGestureRecognizer.delegate;
setp2:創(chuàng)建全屏滑動手勢~調(diào)用系統(tǒng)自帶滑動手勢的target的action方法
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
step3:設(shè)置手勢代理~攔截手勢觸發(fā)
pan.delegate = self;
step4:別忘了~給導航控制器的view添加全屏滑動手勢
[self.view addGestureRecognizer:pan];
step5:將系統(tǒng)自帶的滑動手勢禁用
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
steo6:還記得剛剛設(shè)置的代理嗎挟伙?下面方法什么時候調(diào)用楼雹?在每次觸發(fā)手勢之前都會詢問下代理,是否觸發(fā)尖阔。
這個方法就是攔截手勢觸發(fā)的方法.
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{}
return NO;則不需要觸發(fā)滑動手勢
return YES;則需要觸發(fā)滑動手勢
轉(zhuǎn)載 -- http://www.reibang.com/p/78fc64d387ec