【轉載請註明出處】php
iOS 7中在傳統的左上角返回鍵以外,提供了右滑返回上一級界面的手勢。支持此手勢的是UINavigationController中新增的屬性css
interactivePopGestureRecognizer,即右滑返回只支持以UINavigationController爲容器的ViewController間切換,要想在自定義容器中使用,須要一些額外的工做。html
基本地,控制ViewController是否啓用右滑返回,只須要這樣:ios
.navigationController.interactivePopGestureRecognizer.enabled = ;
默認狀況下enabled爲YES。git
在實際使用中,遇到了一些問題,整理以下:
一、自定義返回按鈕後,右滑返回失效;github
解決方案:比較直觀的辦法是在自定義返回按鈕時,使用backBarButtonItem:ruby
UIButton *backButton = UIBarButtonItem *barItem = .navigationItem.backBarButtonItem = barItem;
P.S:關於backBarButtonItem和leftBarButtonItem的區別:app
http://www.cocoachina.com/ask/questions/show/97110動畫
但這樣沒法支持左上角多個按鈕的狀況。考慮到 interactivePopGestureRecognizer也有delegate屬性, 替換默認的 self . navigationController .interactivePopGestureRecognizer.delegate來配置右滑返回的表現也是可行的。在主ViewController中:ui
.navigationController.interactivePopGestureRecognizer. = ;
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer * (.navigationController.viewControllers.count == ) }
如此作的好處是能夠在主ViewController中配置棧中全部ViewController右滑返回的開啓,而不須要在各個ViewController中分別設置enabled。
值得注意的是:在替換了delegate以後,必須在gestureRecognizerShouldBegin:中設置某ViewController A開啓右滑返回,同時在A中未設置interactivePopGestureRecognizer.enabled = NO,右滑返回纔會開啓,即兩者中任一爲NO,右滑返回都處於關閉狀態。
二、主界面(UINavigationController棧中的第一個ViewController)默認也是開啓右滑返回的。若在主界面上右滑,不會有動做執行。但此時想進入下一級ViewController(如點擊tableView中某一行),切換動畫卻沒有出現。切回桌面再進入應用,發現直接進入了下一級ViewController。
解決方案:這個問題是在最初試驗右滑返回的使用方式時出現的。在使用自定義返回按鈕的ViewController中
.navigationController.interactivePopGestureRecognizer. = ;
解決解決問題1的同時,形成了問題2。和1中類似,都是在替換了默認的delegate以後,interactivePopGestureRecognizer就能調用自定義的返回方法了。具體緣由尚不清楚,待更新【Mark】。
三、在使用右滑返回拖動到一半時,有時會在導航欄上看到三個排成一行的小藍點。
解決方案:緣由不明,解決方案不明。
P.S:在一個帖子上看到一個辦法:
self.navigationItem.title = ;
能夠隱藏小藍點,但因爲小藍點非必現,在不明究竟的狀況下很難說是否有效。
帖子連接: http://www.tuicool.com/articles/FB3IJ3
(1)在工程中查看, self . navigationController .interactivePopGestureRecognizer.delegate其實是一個
_UINavigationInteractiveTransition實例,該類聲明以下:
1 ; 2 3 { 4 *_; 5 } 6 7 ; 8 9 - ()_; 10 - ()_ ; 11 - (); 12 - () ; 13 - () ; 14 - (); 15 - (); 16 - () ; 17 - (); 18 - (); 19 - (); 20 21
能夠看到,委託的內部,其實是一個UIScreenEdgePanGestureRecognizer實例在起做用,它是iOS7中引入的一個新類,用於支持某些狀況下ViewController間切換的初始化。apple官方文檔中對其的描述不多,以下:
A UIScreenEdgePanGestureRecognizer
looks for panning (dragging) gestures that start near an edge of the screen. The system uses screen edge gestures in some cases to initiate view controller transitions. You can use this class to replicate the same gesture behavior for your own actions.
After creating a screen edge pan gesture recognizer, assign an appropriate value to the edges
property before attaching the gesture recognizer to your view. You use this property to specify from which edges the gesture may start. This gesture recognizer ignores any touches beyond the first touch.
要在自定義的ViewController容器中支持右滑返回,可能就須要用到它。
(2)目前很多應用仍是用的iOS 6.1 SDK,而許多iOS7的用戶對右滑返回的需求很是迫切,所以在iOS 6.1SDK下模擬右滑返回在短期內是有必要的,如下是一個經過在push時截取上級ViewController界面爲UIImage做爲下一級ViewController的背景的一種實現方式:
做者的本意彷佛並不要要模擬右滑返回,但稍做修改就能在結構比較簡單的應用中使用,如下是連接:
https://github.com/vinqon/MultiLayerNavigation
P.S:對於一些特殊的需求,如在有ScrollView的界面上(好比瀏覽照片)模擬右滑返回,當滑動到最左邊時即執行右滑返回,該類沒法知足,待處理【Mark】。
一、UIScreenEdgePanGestureRecognizer Class Reference
二、_UINavigationInteractiveTransition.h
三、自定義返回按鈕時,iOS7手勢返回遇到的問題