相信對于滑動(dòng)返回手勢大家都不會(huì)陌生了,不就是導(dǎo)航控制器自帶的滑動(dòng)返回手勢嘛,系統(tǒng)自帶的功能。當(dāng)自定義導(dǎo)航條的返回按鈕的時(shí)候,再自己定義一下滑動(dòng)返回手勢的代理末秃,然后為了解決假死問題妆档,實(shí)現(xiàn)一個(gè)返回BOOL值的代理方法主经,如果是導(dǎo)航控制器的跟控制器就返回NO排霉,否則返回YES。代碼如下:
//這里的協(xié)議是 UIGestureRecognizerDelegate
self.interactivePopGestureRecognizer.delegate = self;
//<UIGestureRecognizerDelegate>協(xié)議中的方法
//為了解決假死問題實(shí)現(xiàn)的代理方法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
//如果子控制器只有一個(gè),就是根控制器,就不要讓左滑返回有效了
return (self.childViewControllers.count >1);
}
以上內(nèi)容相信大家都是非常熟悉的了硬纤,所以在這里就不再繼續(xù)討論了。
但是通過以上代碼實(shí)現(xiàn)的滑動(dòng)返回時(shí)候只能是手指在屏幕邊緣滑動(dòng)才會(huì)生效赃磨,一個(gè)如此不方便的滑動(dòng)返回手勢其實(shí)相當(dāng)雞肋的(我更多時(shí)候?qū)幵更c(diǎn)擊返回按鈕)筝家。
不過如果這個(gè)手勢的有效范圍擴(kuò)大到整個(gè)的屏幕的話,那就大大不同了邻辉,那么現(xiàn)在就一起來看看如何實(shí)現(xiàn)整個(gè)屏幕范圍有效的滑動(dòng)返回手勢吧溪王,其中相當(dāng)一部分代碼我本人表示看不懂腮鞍,如有明白其中緣由的網(wǎng)友也希望能夠請分享一下給大家。以下就是代碼實(shí)現(xiàn):
UIScreenEdgePanGestureRecognizer *gesture = (UIScreenEdgePanGestureRecognizer *)self.interactivePopGestureRecognizer;
gesture.enabled = NO;
NSMutableArray *targets = [gesture valueForKeyPath:@"_targets"];
id gestureTarget = [targets firstObject];
id target = [gestureTarget valueForKeyPath:@"_target"];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
[gesture.view addGestureRecognizer:pan];
到這里在扰,就可以實(shí)現(xiàn)滑動(dòng)返回手勢了缕减,但是這時(shí)候你會(huì)沮喪地發(fā)現(xiàn)煩人的假死問題又出現(xiàn)了,雖然這種情況下的假死問題并不嚴(yán)重芒珠,通過對屏幕一頓猛拖猛點(diǎn)還是可以恢復(fù)的桥狡,但也足以讓人抓狂。
如何解決假死問題呢皱卓?以下代碼是上面代碼的后續(xù):
##注意裹芝,這里下面的代碼是連接著上面一段的代碼。
//這里遵守的協(xié)議是 UIGestureRecognizerDelegate
gesture.delegate = self;
//<UIGestureRecognizerDelegate>協(xié)議中的方法
//為了解決假死問題實(shí)現(xiàn)的代理方法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{//如果子控制器只有一個(gè),就是根控制器,就不要讓左滑返回有效了
return (self.childViewControllers.count >1);
}
加上上述代碼之后娜汁,便可以暢心地使用滑動(dòng)返回手勢了嫂易,從此表示再也不點(diǎn)左上角的返回按鈕了!