? ? ? 在iOS開發(fā)的工作當(dāng)中,Push和Pop經(jīng)常用于界面之間的跳轉(zhuǎn)和返回店雅。蘋果在iOS7以后給導(dǎo)航控制器加了一個(gè)Pop手勢(shì)政基,只要手指在屏幕邊緣滑動(dòng),當(dāng)前的控制器的視圖就會(huì)隨著你的手指移動(dòng)闹啦,當(dāng)用戶松手后沮明,系統(tǒng)會(huì)判斷手指拖動(dòng)出來(lái)的大小來(lái)決定是否要執(zhí)行控制器的pop操作。
? ? ? 這個(gè)想法非常棒窍奋,但是系統(tǒng)給我們規(guī)定手勢(shì)觸發(fā)的范圍必須是屏幕左側(cè)邊緣荐健,還有如果我們自定制了返回按鈕或者隱藏了導(dǎo)航欄,也就是執(zhí)行了下面兩句話中的一句手勢(shì)都會(huì)失效:
[self.navigationController setNavigationBarHidden:YES animated:YES];
self.navigationItem.leftBarButtonItem = 自定制返回按鈕;
那么琳袄,我們就來(lái)解決手勢(shì)失效和手勢(shì)觸發(fā)范圍小這兩個(gè)問(wèn)題:
? ? ?? ①解決失效的問(wèn)題江场,很簡(jiǎn)單,一句話
Object-C版:
self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
Swift版: ??
navigationController?.interactivePopGestureRecognizer?.delegate = self
?????? ②解決手勢(shì)觸發(fā)范圍小,整個(gè)界面都可以觸發(fā)這個(gè)手勢(shì)窖逗,也可以解決第一個(gè)問(wèn)題址否。
? ? ? 這樣解決第一個(gè)問(wèn)題的那一句代碼就要去掉了,然后通過(guò)打铀槲伞:
NSLog(@"%@", self.navigationController?.interactivePopGestureRecognizer);
可以看出self.navigationController?.interactivePopGestureRecognizer是一個(gè)UIScreenEdgePanGestureRecognizer佑附,這樣就不難理解為什么觸發(fā)范圍只有左側(cè)邊緣了。
那么我們解決的辦法就是把這個(gè)UIScreenEdgePanGestureRecognizer禁用仗考,然后自己創(chuàng)建一個(gè)UIPanGestureRecognizer音同,把這個(gè)手勢(shì)給UIScreenEdgePanGestureRecognizer
的代理,請(qǐng)看具體代碼:
Object-C版:
-(void)popGesture{
self.navigationController.interactivePopGestureRecognizer.enabled = NO;//禁用原來(lái)的手勢(shì)
id target = self.navigationController.interactivePopGestureRecognizer.delegate;//獲得pop代理管理對(duì)象
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:target action:@selector(popBack:)];//創(chuàng)建一個(gè)pan手勢(shì)
pan.delegate = self;//設(shè)置代理
[self.view addGestureRecognizer:pan];//添加到self.view上
}
-(void)popBack:(UIPanGestureRecognizer *)pan {
[self.navigationController popViewControllerAnimated:YES];
}
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
return YES;//這個(gè)方法必須返回YES秃嗜,也可以不寫這個(gè)方法瘟斜,默認(rèn)返回YES
}
在viewDidLoad里直接調(diào)用:? [self popGesture];? //OK~~~
Swift版:
func popGesture() {
navigationController?.interactivePopGestureRecognizer?.enabled = false
let target = navigationController?.interactivePopGestureRecognizer?.delegate
let pan = UIPanGestureRecognizer(target: target, action: #selector(self.popBack(_:)))
pan.delegate = self
view.addGestureRecognizer(pan)
}
func popBack(pan: UIPanGestureRecognizer){
?navigationController?.popViewControllerAnimated(true)
}
func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool {
? return true
}
在viewDidLoad里直接調(diào)用:popGesture()? //OK~~~
?? 在我們?nèi)粘i_發(fā)時(shí)缸夹,由于經(jīng)常用到,建議給UIViewController寫一個(gè)Category螺句,這樣用起來(lái)就很方便了虽惭。
?? 今天就到這了,各位看官如果發(fā)現(xiàn)有什么不對(duì)的蛇尚,請(qǐng)加qq:929949003芽唇,一起討論,謝謝H〗佟匆笤!