? ? ? 在iOS開發的工作當中,Push和Pop經常用于界面之間的跳轉和返回。蘋果在iOS7以后給導航控制器加了一個Pop手勢,只要手指在屏幕邊緣滑動,當前的控制器的視圖就會隨著你的手指移動,當用戶松手后,系統會判斷手指拖動出來的大小來決定是否要執行控制器的pop操作。
? ? ? 這個想法非常棒,但是系統給我們規定手勢觸發的范圍必須是屏幕左側邊緣,還有如果我們自定制了返回按鈕或者隱藏了導航欄,也就是執行了下面兩句話中的一句手勢都會失效:
[self.navigationController setNavigationBarHidden:YES animated:YES];
self.navigationItem.leftBarButtonItem = 自定制返回按鈕;
那么,我們就來解決手勢失效和手勢觸發范圍小這兩個問題:
? ? ?? ①解決失效的問題,很簡單,一句話
Object-C版:
self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
Swift版: ??
navigationController?.interactivePopGestureRecognizer?.delegate = self
?????? ②解決手勢觸發范圍小,整個界面都可以觸發這個手勢,也可以解決第一個問題。
? ? ? 這樣解決第一個問題的那一句代碼就要去掉了,然后通過打?。?/p>
NSLog(@"%@", self.navigationController?.interactivePopGestureRecognizer);
可以看出self.navigationController?.interactivePopGestureRecognizer是一個UIScreenEdgePanGestureRecognizer,這樣就不難理解為什么觸發范圍只有左側邊緣了。
那么我們解決的辦法就是把這個UIScreenEdgePanGestureRecognizer禁用,然后自己創建一個UIPanGestureRecognizer,把這個手勢給UIScreenEdgePanGestureRecognizer
的代理,請看具體代碼:
Object-C版:
-(void)popGesture{
self.navigationController.interactivePopGestureRecognizer.enabled = NO;//禁用原來的手勢
id target = self.navigationController.interactivePopGestureRecognizer.delegate;//獲得pop代理管理對象
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:target action:@selector(popBack:)];//創建一個pan手勢
pan.delegate = self;//設置代理
[self.view addGestureRecognizer:pan];//添加到self.view上
}
-(void)popBack:(UIPanGestureRecognizer *)pan {
[self.navigationController popViewControllerAnimated:YES];
}
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
return YES;//這個方法必須返回YES,也可以不寫這個方法,默認返回YES
}
在viewDidLoad里直接調用:? [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里直接調用:popGesture()? //OK~~~
?? 在我們日常開發時,由于經常用到,建議給UIViewController寫一個Category,這樣用起來就很方便了。
?? 今天就到這了,各位看官如果發現有什么不對的,請加qq:929949003,一起討論,謝謝?。?br>