1. 程式人生 > >實現UINavigation全屏滑動返回(一)

實現UINavigation全屏滑動返回(一)

要點

interactivePopGestureRecognizer 是UINavigationController自帶手勢,當我們自定義了導航條的返回按鈕後,這個手勢就自動失效了,也就是說無法滑動返回。

條件

很多情況下我們不得不自定義導航條的返回按鈕,但是我們也要滑動返回上一級的效果。

思路

既然自動失效,那我們就告訴它什麼時候生效。

  • 在非根控制器下生效(用於滑動返回上一級)
  • 在根控制器下失效(防止根控制器被移除,當然系統不會讓我們把它移除,只是會出現bug)
    這裡寫圖片描述
    翻譯:第一個被新增的控制器成為永遠不會被出棧的根控制器

步驟

自定義一個 UINavigationController ,即繼承於 UINavigationController ,名字為 LXFNavigationController ,將代理設為自己,遵守協議 UINavigationControllerDelegate ,實現代理方法 navigationController:didShowViewController:animated:

程式碼

LXFNavigationController.m

/** 系統手勢代理 */
@property(nonatomic, strong) id popGesture;
- (void)viewDidLoad {
    [super viewDidLoad];

    // 記錄系統手勢代理
    self.popGesture = self.interactivePopGestureRecognizer;
    self.delegate = self;
}
#pragma mark - UINavigationControllerDelegate
// 當控制器顯示完畢的時候呼叫
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { // 根據 棧 先進後出 if (self.viewControllers[0] == viewController) { // 根控制器 // 還原代理 self.interactivePopGestureRecognizer.delegate
= self.popGesture; } else { // 非控制器 // 清空手勢代理就能實現滑動返回,iOS6不支援 self.interactivePopGestureRecognizer.delegate = nil; } }

這裡寫圖片描述

最後說兩句

這樣就可以了,但是注意了,現在實現的是滑動返回功能,並沒有全屏滑動返回~~
接下來看下一篇吧
iOS - 實現UINavigation全屏滑動返回(二)