国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

開啟使用系統(tǒng)自帶的側(cè)滑返回

2019-11-09 16:51:03
字體:
供稿:網(wǎng)友
self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;

缺點(diǎn):

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

方案二

實(shí)現(xiàn)UINavigationViewController的代理方法,自定義動畫對象和交互對象。(即自定義轉(zhuǎn)場動畫)

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

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

方案三

極其簡單取巧的方法

iOS7之后是有側(cè)滑返回手勢功能的。注意,也就是說系統(tǒng)已經(jīng)定義了一種手勢,并且給這個手勢已經(jīng)添加了一個觸發(fā)方法(重點(diǎn))。但是,系統(tǒng)的這個手勢的觸發(fā)條件是必須從屏幕左邊緣開始滑動。我們?nèi)∏傻姆椒ㄊ亲约簩懸粋€支持全屏滑動的手勢,而其觸發(fā)方法系統(tǒng)已經(jīng)有,沒必要自己實(shí)現(xiàn)pop的動畫,所以直接就把系統(tǒng)的觸發(fā)處理方法作為我們自己定義的手勢的處理方法。

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

上一篇:熟悉objective-c

下一篇:html5第一天

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 玉山县| 淮滨县| 嘉鱼县| 漳平市| 神农架林区| 资溪县| 巴林右旗| 黔东| 鹤壁市| 河源市| 沁源县| 同心县| 泊头市| 肇源县| 广灵县| 仙居县| 桂林市| 文化| 黑水县| 田阳县| 肃宁县| 南阳市| 方城县| 赤水市| 怀来县| 金门县| 子长县| 太原市| 临海市| 沛县| 东乌珠穆沁旗| 清远市| 昭平县| 盖州市| 阜康市| 上虞市| 绥化市| 利川市| 将乐县| 鄂伦春自治旗| 伊川县|