美文网首页
iOS 侧滑返回假死·push/pop失败

iOS 侧滑返回假死·push/pop失败

作者: 郭桥生 | 来源:发表于2018-08-23 15:21 被阅读0次

    最近改一个项目
    里面用到了侧滑返回·部分页面隐藏导航栏
    改的过程中发现 上一波人两种效果都没搞好
    所以现在我的任务就是把它搞好,可是实际的时候页面切换出现了假死问题
    上一个项目是一样的套路,为什么这个项目就出错了呢,搞了我两天后不得不坐下来像个程序员一样一步一步检查代码了

    • 1 遇到的问题->触发手势返回之后 下一次跳转会进入假死状态
    • 2 可能的原因->interactivePopGestureRecognizer失效 · 线程切换问题
    1 interactivePopGestureRecognizer的检查

    所以先从interactivePopGestureRecognizer设置开始检查
    这里也没什么说的,直接之前的代码copy过来

    // 这些代码放到继承的UINavigationController里面即可
    - (void)viewDidLoad {
        [super viewDidLoad];
        [self updatePopGestureDelegate];
    }
    
    - (void)updatePopGestureDelegate {
        /*
         默认全局开启侧滑返回
         在BaseViewController里面每一个viewDidLoad里面设置
         self.navigationController.interactivePopGestureRecognizer.enabled = NO;
         特殊情况下
         在viewDidAppear里面设置self.navigationController.interactivePopGestureRecognizer.enabled = NO
         在viewDidDisappear里面设置self.navigationController.interactivePopGestureRecognizer.enabled = YES
         */
        __weak MHWNavigationController *weakSelf = self;
        if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
            self.interactivePopGestureRecognizer.delegate = weakSelf;
            self.delegate = weakSelf;
        }
    }
    
    //侧滑代理
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
        if (gestureRecognizer == self.interactivePopGestureRecognizer && self.viewControllers.count > 1) {
            return YES;
        }
        return NO;
    }
    

    实际实际使用中加了这些就够了,但是在运行的时候发现还是不行
    所以排除这一块的问题,转向检查线程切换的问题

    2 线程切换的检查

    因为这个项目里面又的页面隐藏了导航栏,有的页面没隐藏,这样来来去去的很乱,页面切换有的连动画都没有,体验起来就像是个三流app,所以我又加了一个新的BaseViewController并且在里面增加了动画设置

    - (void)viewWillAppear:(BOOL)animated{
        [super viewWillAppear:animated];
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.navigationController setNavigationBarHidden:self.hideNavigationbarWhenViewWillAppear animated:YES];
        });
    }
    
    - (void)viewWillDisappear:(BOOL)animated{
        [super viewWillDisappear:animated];
        if (self.hideNavigationbarWhenViewWillDisappear) {
            [self.navigationController setNavigationBarHidden:YES animated:YES];
        }
    }
    

    就是这一句dispatch_async啊,就是这线程切换
    系统的方法最好不要加线程切换,把这一句dispatch_async去掉
    果然就OK了

    [self.navigationController setNavigationBarHidden:YES animated:YES];
    系统方法最好在默认线程环境执行
    就像push pop操作一样在viewWillAppear里面失效一样,线程还是不能乱切
    搞了我两天才想到有过这么一个方法设置

    关联关键字interactivePopGestureRecognizer·freeze·push not work

    相关文章

      网友评论

          本文标题:iOS 侧滑返回假死·push/pop失败

          本文链接:https://www.haomeiwen.com/subject/actmiftx.html