看到現在app 中越來越流行的手勢滑動實現pop效果,心里很是癢癢躍躍欲試,經過多方查看資料,終于在簡書上找到了詳細的實現方案:
經過修改實現了簡單的(自定義導航控制器)手勢滑動實現pop返回效果:
1.先打印了導航控制器的interactivePopGestureRecognizer,log結果如下:
<UIScreenEdgePanGestureRecognizer: 0x7fe5f1579ce0; state = Possible; delaysTouchesBegan = YES; view = <UILayoutContainerView 0x7fe5f1567ea0>; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition
2.自定義UipanGestureRecognizer,移花接木到該手勢的target和action;action好處理,但是target的活得用runtime時可以拿到,但過程略復雜,
打印interactivePopGestureRecognizer.delegate;發現正好也是_UINavigationInteractiveTransition,所以問題解決:
id target = self.interactivePopGestureRecognizer.delegate;
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:NSSelectorFromString(@"handleNavigationTransition:")];
3.測試發現如果當前導航控制器的自控制器只有一個的時候,拖拽手勢會發生bug,這時就需要腹瀉pan手勢的
-(BOOL)gestureRecognizerShouldBegin:來決定手勢操作是否起作用:
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
return self.childViewControllers.count==1?NO :YES;
}
4.附上github上forkingdog的更加完美的分類實現方法:
https://github.com/forkingdog/UITableView-FDTemplateLayoutCell
TIP:相關bug小提示,如果自定了導航控制器的自控制器的leftBarButtonItem,可能會引發邊緣滑動pop效果的失靈,是由于
self.interactivePopGestureRecognizer.delegate被滯空的原因
新聞熱點
疑難解答