亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

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

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

缺點:

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

方案二

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

這是蘋果官方在WWDC上提倡的方法,靈活性高??梢愿叨茸远xpush和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第一天

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人福利视频在线观看| 成人xvideos免费视频| 亚洲精品福利免费在线观看| 成人av在线亚洲| 欧美性xxxxxxxxx| 亚洲人a成www在线影院| 欧美亚洲日本网站| 欧美性理论片在线观看片免费| 国产成人av在线| 久久91精品国产91久久跳| 久久久视频精品| 7777精品视频| 欧美与欧洲交xxxx免费观看| 国产精品久在线观看| 超碰97人人做人人爱少妇| 中文字幕日韩精品在线观看| 亚洲精品狠狠操| 91极品视频在线| 欧美激情一级欧美精品| 欧美www视频在线观看| 97婷婷大伊香蕉精品视频| 国产精品久久综合av爱欲tv| 色多多国产成人永久免费网站| 成人亚洲欧美一区二区三区| 欧美性做爰毛片| 亚洲欧美日韩中文在线制服| 日韩av第一页| www亚洲欧美| 4444欧美成人kkkk| 久久久久国色av免费观看性色| 欧美做受高潮电影o| 国自产精品手机在线观看视频| 午夜精品久久久久久久男人的天堂| 国产精品免费视频xxxx| 欧美高清第一页| 久久91精品国产| 91热精品视频| 久久久电影免费观看完整版| 91免费福利视频| 国产成人综合精品| 欧美诱惑福利视频| 色综合伊人色综合网| 欧美性xxxxx极品| 亚洲欧洲日产国产网站| 欧美激情综合色| 欧美整片在线观看| 中文字幕亚洲综合久久筱田步美| 成人在线播放av| 俺去亚洲欧洲欧美日韩| 欧美精品电影免费在线观看| 国内精品久久久久久久| 欧美日韩中国免费专区在线看| 日韩精品视频在线观看免费| …久久精品99久久香蕉国产| 国产91色在线免费| 亚洲色无码播放| 日韩av在线导航| 成人美女免费网站视频| 91国产美女视频| 亚洲综合日韩中文字幕v在线| 欧美国产极速在线| 久久久久久久久久久亚洲| 91亚洲精品久久久久久久久久久久| 日韩欧美精品网站| 黑人巨大精品欧美一区二区免费| 亚洲偷熟乱区亚洲香蕉av| 亚洲国产欧美一区| 91成人国产在线观看| 久久久噜噜噜久久中文字免| 国产精品成人品| 国产精品欧美一区二区三区奶水| 在线成人一区二区| 国产a∨精品一区二区三区不卡| 成人在线精品视频| 亚洲欧美日韩高清| 日韩网站免费观看高清| 亚洲国产日韩欧美综合久久| 国产亚洲精品美女| 亚洲国产精品va在线| 欧美超级乱淫片喷水| 亚洲欧美精品伊人久久| 一区二区三区美女xx视频| 色综合久综合久久综合久鬼88| 精品无人区太爽高潮在线播放| 黑人精品xxx一区一二区| 亚洲天堂av在线免费| 九九精品视频在线| 97人人做人人爱| 国产精品久久一| 欧美成人中文字幕| 欧美精品在线看| 成人妇女免费播放久久久| 国产精品中文字幕在线| 亚洲娇小xxxx欧美娇小| 国产精品久久久久免费a∨大胸| 色午夜这里只有精品| 日韩经典中文字幕| 欧美日韩中国免费专区在线看| 国产午夜精品麻豆| 国产精品久久久久久中文字| 中文国产成人精品久久一| 欧美精品在线免费观看| 日韩女优在线播放| 亚洲国产精品人人爽夜夜爽| 另类专区欧美制服同性| 欧美黄色成人网| 国产午夜精品美女视频明星a级| 午夜精品视频在线| 久久久国产一区| 欧美成在线观看| 国产极品jizzhd欧美| 日本久久久久亚洲中字幕| 欧美性猛交xxxx富婆| 久久亚洲私人国产精品va| 欧美亚洲另类激情另类| 91精品国产91久久久久久| 国产视频一区在线| 欧美日本在线视频中文字字幕| 美日韩精品免费视频| 97福利一区二区| 日本在线精品视频| 日韩视频免费观看| 97精品国产91久久久久久| 欧美主播福利视频| 国产一区二区三区在线看| 国产日韩欧美中文| 欧美高清在线视频观看不卡| 国产成人在线一区二区| 色无极影院亚洲| 国内精品久久久久影院 日本资源| 欧美黑人巨大精品一区二区| 国产精品pans私拍| 日韩av一区二区在线| 久久精品国产视频| 亚洲欧美激情在线视频| 国产亚洲精品成人av久久ww| 国产91在线播放精品91| 久久久久久久久久婷婷| 欧美成人在线网站| 日韩一区二区三区xxxx| 国产91精品高潮白浆喷水| 日本久久久久久久久| 青青草原成人在线视频| 日韩视频免费观看| 国产精品亚洲视频在线观看| 国产玖玖精品视频| 欧美成人合集magnet| 大量国产精品视频| 乱亲女秽乱长久久久| 国产这里只有精品| 成人免费看黄网站| 国产视频丨精品|在线观看| 久99久在线视频| 国产精品久在线观看| 68精品国产免费久久久久久婷婷| 黑人巨大精品欧美一区免费视频| 日韩av在线一区二区| 91影视免费在线观看| 欧美日韩一区免费| 亚洲精品中文字幕女同| 久久中文字幕国产| 中文字幕在线视频日韩| 亚洲成人在线视频播放| 欧美午夜性色大片在线观看|