對於iOS用戶來講,右滑返回是一個比較常見的。那麼對於一個開放者來講,怎麼去實現?其中又有哪些坑呢?app
1.邊緣觸發側滑(蘋果原生)
2.全屏觸發側滑動畫
1.系統自帶(不自定義導航)
2.使用系統動畫去實現
3.自定義導航,默認開啓系統的返回手勢
參考文章:
iOS側滑返回的三種實現方式spa
至於兩種側滑效果孰好孰壞沒有辦法說,這就須要根據公司的產品需求去衡量。
對於全屏手勢的最簡便的實現方式就是定義一個全屏手勢,其實現方式仍是去取系統的左滑手勢(@select(handleNavigationTransition:))實現。code
Bug描述:當app集成了側滑返回手勢,在根目錄側滑手勢,再任意點擊push新的控制器,頁面卡死。
解決過程:用view去分層查看會看到新控制器是push出來的。但頁面上卻沒有。
解決方法:禁用根目錄下的側滑手勢。rem
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if ( gestureRecognizer == self.interactivePopGestureRecognizer ) { UIViewController *vc = self.viewControllers.lastObject; // 禁用某些不支持側滑返回的頁面 if ([vc isKindOfClass:[OpenContainerDoorVC class]]) { return NO; } // 禁用根目錄的側滑手勢 if ( self.viewControllers.count < 2 || self.visibleViewController == [self.viewControllers objectAtIndex:0] ) { return NO; } } return YES; }
Bug描述:當從掃碼頁面跳到新頁面時,側滑返回就又回到掃碼頁面,但實際但願到掃碼的上一個頁面。
解決過程:咱們知道navigation是有viewControllers這樣一個壓棧出棧的屬性的。那麼假如能夠修改其中的控制器的順序或者增刪控制器,天然能夠完美解決這個問題。
解決方法:get
NSMutableArray *VCs = [NSMutableArray arrayWithArray: self.navigationController.viewControllers]; // 剔除想要移除的控制器 [VCs removeObject:self]; [self.navigationController setViewControllers:VCs];
Bug描述:噹噹前頁面最底層是scrollView時,側滑手勢失效問題。
解決思路:當在邊緣時,禁用scrollView的滑動手勢。
解決方法:產品
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { if ([otherGestureRecognizer isKindOfClass:[UIScreenEdgePanGestureRecognizer class]]) { if (gestureRecognizer.state != UIGestureRecognizerStatePossible) { return YES; } } return NO; }
後來看到一篇更好的文章去處理這方面的問題,此處記錄一二。
一行代碼,讓你的應用中UIScrollView的滑動與側滑返回並存it
https://www.jianshu.com/p/2410c704ba40?from=timeline&isappinstalled=0io