iOSUI-導航控制器全屏滑動返回效果

來源:互聯網
上載者:User

標籤:

導航控制器預設內建了側滑功能,當使用者在介面的左邊滑動的時候,就會有側滑功能。但是如何?全屏滑動返回效果?

分析:

第一步分析:

1.導航控制器的view內建了滑動手勢,只不過手勢的觸發範圍只能在左邊。

2.當使用者在介面左邊拖動,就會觸發滑動手勢方法,並且有滑動返回功能,說明系統手勢觸發的方法已經實現了滑動返回功能。

3.為什麼說系統手勢觸發的方法已經實現了滑動返回功能?

原因:

  • 建立滑動手勢對象的時候,需要綁定監聽者,當觸發手勢的時候會調用target的action。

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:action];
  • 當使用者在介面左邊滑動,有滑動返回功能,這是因為觸發手勢了,調用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-導航控制器全屏滑動返回效果

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.