實現UINavigation全屏滑動返回(一)
阿新 • • 發佈:2019-02-11
要點
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全屏滑動返回(二)