iOS开发常见问题-利用系统自带左边缘滑动手势实现全屏幕都可以点击滑动

在自定义UINavigationController中,利用系统自带左边缘滑动手势实现全屏幕都可以点击滑动

1.防止手势冲突
   self.interactivePopGestureRecognizer.enabled = NO;
2.给自定义UINavigationController的view添加手势
  让'self.interactivePopGestureRecognizer.delegate'监听滑动事件
  实现系统内部方法(po xx手势):'handleNavigationTransition:'
   UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] 
                                 initWithTarget:self.interactivePopGestureRecognizer.delegate 
                                 action:@selector(handleNavigationTransition:)];
3.再将自定义手势的代理设置为控制器
   pan.delegate = self;
   [self.view addGestureRecognizer:pan];

实现代理方法,例如:
如果不是第一个控制器就可以滑动
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    // 手势何时有效 : 当导航控制器的子控制器个数 > 1就有效
    return self.childViewControllers.count > 1;
}

解决系统返回手势与scrollView滑动手势冲突问题
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
        shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
    // 首先判断响应gestureRecognizer的view是不是系统UILayoutContainerView
    if ([gestureRecognizer.view isKindOfClass:NSClassFromString(@"UILayoutContainerView")]) {
        // 如果otherGestureRecognizer的响应者是UIScrollView,
        // 再判断otherGestureRecognizer的state是began,
        // 同时判断scrollView的位置是不是正好在最左边
        // 满足条件即可实现返回手势
        if ([otherGestureRecognizer.view isKindOfClass:[UIScrollView class]]) {
            UIScrollView *scrollView = (UIScrollView *)otherGestureRecognizer.view;
            if (otherGestureRecognizer.state == UIGestureRecognizerStateBegan &&
                scrollView.contentOffset.x == 0) {
                return YES;
            }
        }
    }
    return NO;
}

进入某个页面禁止手势后可以重写系统方法,恢复手势响应
- (NSArray<UIViewController *> *)popToRootViewControllerAnimated:(BOOL)animated
{
    self.interactivePopGestureRecognizer.enabled = YES;
    return  [super popToRootViewControllerAnimated:animated];
}

如何解决导航控制器pop手势失效

成为手势代理
self.interactivePopGestureRecognizer.delegate = self;

实现需要的代理方法(基本同上),例如:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
    // 手势何时有效 : 当导航控制器的子控制器个数 > 1就有效
    return self.childViewControllers.count > 1;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 15,847评论 4 61
  • Swift版本点击这里欢迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh阅读 26,329评论 7 249
  • 背着吉他的少年 黑暗中他迷失了方向 只记得在北塔路东段 他看见了散步的夫妇 奔跑的孩子虫和草坪 铁丝网拦住了回家路...
    鲨鱼清风阅读 167评论 0 0
  • 给我个机会 扎到雪坑里 回到过去 回到没有失去的地方 没有那么曲折坎坷的人生里 周天three 爱你水宝 晚安
    水蓝水蓝阅读 120评论 0 0
  • 1、 写给亲爱的茜茜: 昨天晚上你电话中嘱托妞妞注意身体,别太熬夜学习,以平常心对待期中考试,传递给妞妞爸妈的信任...
    李连生阅读 198评论 0 0

友情链接更多精彩内容