-
側滑返回
- NavigationController自從iOS7.0之后, 增加了一個滑動返回功能, 當push入一個控制器并且展示了這個控制器的View時, 除了點擊左上方的返回按鈕之外, 還可以向右滑動屏幕左邊緣同樣可以達到返回上一級界面的效果
- 但是側滑返回的問題就在于, 我們在項目中, 經常要使用自定義的返回按鈕. 而當你使用了自定義按鈕時, 你會發現側滑返回效果掛掉了
-
側滑返回的原理分析
-
手勢:
側滑返回, 需要手指側滑屏幕, 因此從這一點可以推斷出來, 側滑返回功能應該是一個UIGestureRecognizer
-
進入UINavigationController的頭文件中, 搜索UIGestureRecognizer, 這時我們會發現一個屬性, 他就是用來管理導航控制器側滑返回功能的手勢
// 這就是側滑返回手勢 @property(nullable, nonatomic, readonly) UIGestureRecognizer *interactivePopGestureRecognizer NS_AVAILABLE_IOS(7_0)
通過查看文檔, 可以了解到, 這個手勢專門用來執行pop功能, 將棧頂控制器移除, 同時你還可以給當前這個View增加別的手勢并且和側滑返回手勢綁定在一起(但是盡量不要這么用, 不覺得很反人類么...)
-
代理:
-
這個手勢是readonly, 也就是說你不能去修改他, 但是他在自定義按鈕的時候確確實實的失效了. 而導致這個的真正原因, 可以讓人聯想到UIGestureRecognizerDelegate代理中的代理方法
// 這個方法返回的BOOL值, 決定這個手勢是否能夠生效 - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
從這一點基本上就可以斷定, 側滑返回的代理, 檢測到你自定義了返回按鈕, 因此攔截了側滑返回手勢
而我們要做的就是不讓代理攔截他
-
-
-
恢復側滑返回手勢
-
首先, 我們要在自定義的NavigationController中, 當ViewDidLoad方法調用了, 為側滑返回手勢設置代理, 注意當前類要遵守
<UIGestureRecognizerDelegate>
協議self.interactivePopGestureRecognizer.delegate = self;
-
手動實現代理方法, 讓手勢可以使用
- 在這里一定要注意: 如果你不判斷當前子控制器的數量的話, 直接返回YES, 那么你的根控制器也會響應側滑返回手勢
- 如果根控制器使用側滑返回的話, 你的UI界面就會變為假死狀態, 這是一個很嚴重的Bug, 因此一定要注意
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
return self.childViewControllers.count > 1;
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
-
NavigationController的側滑返回功能
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
- 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
推薦閱讀更多精彩內容
- 新增: 解決 1.解決其他的對viewController中手勢通過實現手勢代理方法處理,造成手勢方法不識別,而出...
- 由于iPhone不像安卓手機那樣底部有返回鍵可以點擊返回上個頁面,每次返回上一頁都需要點擊頁面的導航欄返回按鈕,這...