標籤:
導航控制器預設內建了側滑功能,當使用者在介面的左邊滑動的時候,就會有側滑功能。但是如何?全屏滑動返回效果?
分析:
第一步分析:
1.導航控制器的view內建了滑動手勢,只不過手勢的觸發範圍只能在左邊。
2.當使用者在介面左邊拖動,就會觸發滑動手勢方法,並且有滑動返回功能,說明系統手勢觸發的方法已經實現了滑動返回功能。
3.為什麼說系統手勢觸發的方法已經實現了滑動返回功能?
原因:
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:action];
第二步分析:
列印導航控制器內建的滑動手勢:
NSLog(@"%@",self.interactivePopGestureRecognizer);
得 到: <UIScreenEdgePanGestureRecognizer: 0x7fe243d29150; state = Possible; delaysTouchesBegan = YES; view = <UILayoutContainerView 0x7fe243d28d90>; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7fe243d27b30>)>>
可知:
1.系統內建的手勢是UIScreenEdgePanGestureRecognizer類型對象,螢幕邊緣滑動手勢
2.系統內建手勢target是_UINavigationInteractiveTransition類型的對象
3.target調用的action方法名叫handleNavigationTransition:
UIScreenEdgePanGestureRecognizer,看名稱就知道,這個手勢的範圍只能在螢幕的周邊,就是因為這個手勢,系統內建的滑動效果,只能實現側邊滑動。
第三步分析:
現在只差target, _UINavigationInteractiveTransition 真實類型
通過列印系統內建的滑動手勢的代理,發現正好是_UINavigationInteractiveTransition對象,因此可猜測這個代理對象就是target對象,只要拿到它,就拿到系統內建滑動手勢的target對象。
// 列印系統內建滑動手勢的代理對象 NSLog(@"%@",self.interactivePopGestureRecognizer.delegate);
得到:<_UINavigationInteractiveTransition: 0x7ffabb732cb0>
實現代碼:
導航控制器全屏滑動注意點:
1.禁止系統內建滑動手勢使用。
2.只有導航控制器的非根控制器才需要觸發手勢,使用手勢代理,控制手勢觸發。
- (void)viewDidLoad{ [super viewDidLoad]; //擷取系統手勢 UIScreenEdgePanGestureRecognizer *gestu = self.interactivePopGestureRecognizer; // 擷取系統內建滑動手勢的target對象
target = self.interactivePopGestureRecognizer.delegate;
// 一定要記住禁止系統的手勢 self.interactivePopGestureRecognizer.enabled = NO; //添加自己的全屏滑動手勢 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)]; [self.view addGestureRecognizer:pan]; // 當是根控制器的時候禁止手勢, 當不是根控制器的時候開啟手勢 // 設定手勢代理,攔截手勢觸發, 當手勢開始滑動的時候就判斷 pan.delegate = self;}#pragma mark -UIGestureRecognizerDelegate//當手勢開始滑動 作用:攔截手勢觸發- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{ //子控制器個數只剩下一個(這一個就是根控制器),手勢不可用 BOOL open = self.childViewControllers.count != 1; return open;}
iOSUI-導航控制器全屏滑動返回效果