前言
先扯一會(huì)兒犢子
本文簡(jiǎn)介
見題知意 不再加以解釋
我相信針對(duì)每一個(gè)iOS開發(fā)者來說,除了根視圖控制器外,所有的界面通過導(dǎo)航欄push過去的界面都是可以通過右滑來返回上一個(gè)界面,其實(shí),在很多應(yīng)用和APP中,用戶已經(jīng)習(xí)慣了這個(gè)功能,然而,作為開發(fā)者的我們,也并沒有為此做些什么,因?yàn)槲覀冊(cè)趧?chuàng)建項(xiàng)目時(shí),蘋果公司已經(jīng)為我們都做好了,那么,我們這期就來聊一聊這系統(tǒng)自帶的右滑方法以及如何修改和攔截這個(gè)不被重視的方法,
什么時(shí)候會(huì)被攔截
當(dāng)我們使用代碼或者用storyboard來創(chuàng)建一個(gè)新的控制器的時(shí)候,我們很少注意導(dǎo)航欄的leftItem~因?yàn)檎G闆r下, push 到下一個(gè)界面的leftItem就是上一個(gè)界面的 self.title ,并且它也就是一個(gè)返回的功能,所以,我們很少去在意這些,但當(dāng)我們有些需求,需要自定義leftItem的時(shí)候~那么問題就來了,
- 問題一:怎么自定義
leftItem - 問題二:為什么系統(tǒng)自帶的右滑返回手勢(shì)失效
- 問題三:怎么解決這個(gè)失效問題
1.怎么自定義leftItem
其實(shí),這個(gè)東西嘛,說簡(jiǎn)單也是很簡(jiǎn)單的,因?yàn)?,我們很明確的知道,左導(dǎo)航欄就一個(gè)功能,那就是返回上一個(gè)界面,很顯然,是需要用戶交互的必用按鈕,
說多了都是廢話~直接上代碼
//自定義一個(gè)按鈕
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;
//按鈕點(diǎn)擊事件 返回上一個(gè)界面
- (void)backLastView{
[self.navigationController popViewControllerAnimated:YES];
}
需要注意的是xcode自動(dòng)從6.0之后,leftItem距左屏幕邊距有16個(gè)像素點(diǎn),這樣會(huì)導(dǎo)致在視覺上會(huì)感覺有點(diǎn)偏右,不算美觀,然而對(duì)于大多數(shù)處女座的程序員來說,這明顯是不能讓人去接受的,解決辦法有很多,在這里提供一個(gè)最為方便的方法,設(shè)置一下按鈕的contentEdgeInsets(文字)imageEdgeInsets(圖片)屬性即可,如:leftButton.contentEdgeInsets = UIEdgeInsetsMake(0, -16, 0, 0);
2.為什么系統(tǒng)自帶的右滑返回手勢(shì)失效
這也是我一直所關(guān)心的問題,還希望知道的可以私信我
QQ:2638006336
3.怎么解決這個(gè)失效問題
其實(shí)很簡(jiǎn)單很簡(jiǎn)單~只需要添加下面這一句代碼即可
self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
后來很多網(wǎng)友反饋這里還是有點(diǎn)問題的,具體文章已經(jīng)更新,可以參考 這篇文章
或者直接聯(lián)系我QQ也可以 *********(笨笨編程)
****寫在結(jié)尾的話****
其實(shí)到這里,問題應(yīng)該都解決了,但是,畢竟右滑返回手勢(shì)只能靠近屏幕左邊緣才能使用,我們?nèi)绾瓮ㄟ^調(diào)用系統(tǒng)方法來實(shí)現(xiàn)在整個(gè)屏幕右滑就可以實(shí)現(xiàn)返回功能呢
step1:需要獲取系統(tǒng)自帶滑動(dòng)手勢(shì)的target對(duì)象
id target = self.navigationController.interactivePopGestureRecognizer.delegate;
step2:創(chuàng)建全屏滑動(dòng)手勢(shì)~調(diào)用系統(tǒng)自帶滑動(dòng)手勢(shì)的target的action方法
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
step3:設(shè)置手勢(shì)代理~攔截手勢(shì)觸發(fā)
pan.delegate = self;
step4:別忘了~給導(dǎo)航控制器的view添加全屏滑動(dòng)手勢(shì)
[self.view addGestureRecognizer:pan];
step5:將系統(tǒng)自帶的滑動(dòng)手勢(shì)禁用
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
step6:還記得剛剛設(shè)置的代理嗎?下面方法什么時(shí)候調(diào)用?在每次觸發(fā)手勢(shì)之前都會(huì)詢問下代理,是否觸發(fā)。
這個(gè)方法就是攔截手勢(shì)觸發(fā)的方法.
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{}
return NO;則不需要觸發(fā)滑動(dòng)手勢(shì)
return YES;則需要觸發(fā)滑動(dòng)手勢(shì)
好啦好啦,差不多了,更多內(nèi)容關(guān)注笨笨編程其他簡(jiǎn)書,這里有你將會(huì)更加精彩~