麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

開啟使用系統自帶的側滑返回

2019-11-09 16:51:03
字體:
來源:轉載
供稿:網友
self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;

缺點:

必須從屏幕邊緣左側滑起才會觸發;一旦自定義導航控制器或者自定義返回按鈕,就會失效。

方案二

實現UINavigationViewController的代理方法,自定義動畫對象和交互對象。(即自定義轉場動畫)

這是蘋果官方在WWDC上提倡的方法,靈活性高。可以高度自定義push和pop轉場動畫。這種方法需要我們徹底實現側滑返回,那我們的思路就是:

先給view添加一個UipanGestureRecognizer手勢;再自定義該手勢的觸發方法,該方法里實現了側滑。
1. 先創建一個BaseViewController,給該控制器的view添加拖動手勢;
- (void)viewDidLoad{ [super viewDidLoad]; self.navigationController.delegate = self; // 設置navigationController的代理為self,并實現其代理方法 self.view.userInteractionEnabled = YES; UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(backHandle:)]; [self.view addGestureRecognizer:panGesture];}- (void)backHandle:(UIPanGestureRecognizer *)recognizer{ [self customControllerPopHandle:recognizer];}
2.側滑手勢會觸發這個回調方法;
- (void)customControllerPopHandle:(UIPanGestureRecognizer *)recognizer{ if(self.navigationController.childViewControllers.count == 1) { return; } // _interactiveTransition就是代理方法2返回的交互對象,我們需要更新它的進度來控制POP動畫的流程。(以手指在視圖中的位置與屏幕寬度的比例作為進度) CGFloat PRocess = [recognizer translationInView:self.view].x/self.view.bounds.size.width; process = MIN(1.0, MAX(0.0, process)); if(recognizer.state == UIGestureRecognizerStateBegan) { // 此時,創建一個UIPercentDrivenInteractiveTransition交互對象,來控制整個過程中動畫的狀態 _interactiveTransition = [[UIPercentDrivenInteractiveTransition alloc] init]; [self.navigationController popViewControllerAnimated:YES]; } else if(recognizer.state == UIGestureRecognizerStateChanged) { [_interactiveTransition updateInteractiveTransition:process]; // 更新手勢完成度 } else if(recognizer.state == UIGestureRecognizerStateEnded ||recognizer.state == UIGestureRecognizerStateCancelled) { // 手勢結束時,若進度大于0.5就完成pop動畫,否則取消 if(process > 0.5) { [_interactiveTransition finishInteractiveTransition]; } else { [_interactiveTransition cancelInteractiveTransition]; } _interactiveTransition = nil; }}
3.實現UINavigationControllerDelegate的兩個協議方法,分別返回自定義動畫需要的兩個重要對象;
// 代理方法1:// 返回一個實現了UIViewControllerAnimatedTransitioning協議的對象 ,即完成轉場動畫的對象- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC{ if(operation == UINavigationControllerOperationPop) // 若operation是pop,就返回我們自定義的轉場動畫對象 { return [[POPAnimation alloc] init]; } return nil;}// 代理方法2// 返回一個實現了UIViewControllerInteractiveTransitioning協議的對象,即完成動畫交互(動畫進度)的對象- (id<UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransitioning>)animationController{ if([animationController isKindOfClass:[POPAnimation class]]) { return _interactiveTransition; } return nil;}
4.創建一個自定義動畫類:POPAnimation。這是自定義動畫的核心
自定義動畫類,即一個實現了UIViewControllerAnimatedTransitioning協議的類。實現該協議的兩個方法,一個返回動畫執行時間,一個自定義動畫。#import "POPAnimation.h"@interface POPAnimation ()@end@implementation POPAnimation// 實現兩個協議的方法// 返回動畫執行的時間- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext{ return 0.25;}//- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{ __block UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey]; // 動畫來自哪個vc UIViewController *toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey]; // 轉場到哪個vc // 轉場動畫是兩個控制器視圖的動畫,需要一個containerView作為“舞臺” UIView *containerView = [transitionContext containerView]; [containerView insertSubview:toVC.view belowSubview:fromVC.view]; NSTimeInterval duration = [self transitionDuration:transitionContext]; // 獲取動畫執行時間(實現的協議方法) // 執行動畫,讓fromVC的view移動到屏幕最右側 [UIView animateWithDuration:duration animations:^{ fromVC.view.transform = CGAffineTransformMakeTranslation([UIScreen mainScreen].bounds.size.width, 0); } completion:^(BOOL finished) { // 當動畫執行完時,這個方法必須要調用,否則系統會認為你的其余操作都在動畫執行過程中 [transitionContext completeTransition:![transitionContext transitionWasCancelled]]; }];}@endpop.gif

方案三

極其簡單取巧的方法

iOS7之后是有側滑返回手勢功能的。注意,也就是說系統已經定義了一種手勢,并且給這個手勢已經添加了一個觸發方法(重點)。但是,系統的這個手勢的觸發條件是必須從屏幕左邊緣開始滑動。我們取巧的方法是自己寫一個支持全屏滑動的手勢,而其觸發方法系統已經有,沒必要自己實現pop的動畫,所以直接就把系統的觸發處理方法作為我們自己定義的手勢的處理方法。

#import "ViewController.h"@interface ViewController ()<UIGestureRecognizerDelegate>@end@implementation ViewController- (void)viewDidLoad{ [super viewDidLoad]; id target = self.navigationController.interactivePopGestureRecognizer.delegate; // handleNavigationTransition:為系統私有API,即系統自帶側滑手勢的回調方法,我們在自己的手勢上直接用它的回調方法 UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)]; panGesture.delegate = self; // 設置手勢代理,攔截手勢觸發 [self.view addGestureRecognizer:panGesture]; // 一定要禁止系統自帶的滑動手勢 self.navigationController.interactivePopGestureRecognizer.enabled = NO;}// 什么時候調用,每次觸發手勢之前都會詢問下代理方法,是否觸發// 作用:攔截手勢觸發- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{ // 當當前控制器是根控制器時,不可以側滑返回,所以不能使其觸發手勢 if(self.navigationController.childViewControllers.count == 1) { return NO; } return YES;}

上一篇:熟悉objective-c

下一篇:html5第一天

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 亚洲午夜久久久精品一区二区三区 | 爱操成人网 | 欧美性受xxxx人人本视频 | 成人在线视频在线观看 | 久久久久久久黄色片 | 一区二区免费看 | 调教小男生抽打尿孔嗯啊视频 | 九九热免费精品视频 | 香蕉国产片 | 天天看夜夜爽 | 久久网站热最新地址4 | 一区二区三区日韩精品 | 中文在线观看www | 草莓福利社区在线 | 精品国产一区二 | 国产1区2区在线观看 | 一级美女大片 | 国产免费观看a大片的网站 欧美成人一级 | 久久网站热最新地址 | 97久久精品一区二区三区观看 | 91短视频在线观看视频 | 成人情欲视频在线看免费 | 精品亚洲夜色av98在线观看 | 亚洲精品欧美二区三区中文字幕 | 久久96国产精品久久秘臀 | 成人午夜久久 | av电影免费观看 | 国产成人av免费看 | 亚洲精品一区二区三区免 | 毛片视频播放 | 激情大乳女做爰办公室韩国 | 羞羞视频入口 | 欧美日韩免费一区二区三区 | 久久色伦理资源站 | 宅男噜噜噜66国产免费观看 | 成人爽a毛片免费啪啪红桃视频 | 国产三级国产精品国产普男人 | 少妇色诱麻豆色哟哟 | 毛片区 | 韩国19禁在线 | 深夜精品福利 |