美文网首页
[iOS]解决重写UINavigationController导

[iOS]解决重写UINavigationController导

作者: 雨影 | 来源:发表于2019-03-13 11:45 被阅读0次

    iOS侧滑卡死现象原因分析

    现象重现

    interactivePopGestureRecognizer是在iOS7后为UINavigationController新增的一个手势属性,使原来的pop返回可以通过滑动手势实现,从而方便了有单手操作习惯的用户。但是有个问题,苹果一直没有解决(至少iOS10.1之前还没有解决,可能苹果并不认为这是个问题吧):如果我们自定义了UINavigationController的leftBarButtonItem(一般是返回按钮),则在UINavigationController的rootViewController上滑动返回时,会出现界面卡死的情况。

    原因分析

    原因其实很简单,在UINavigationController的rootViewController上滑动时也响应了滑动返回手势,但此时,我们自定义了Nav的返回按钮,系统便不知道怎么处理了,于是乎...(个人分析原因)

    解决方法:

    知道了原因,解决起来就很方便了。既然nav的rootViewController不知道如何响应滑动返回手势,那我们干脆把rootViewController的滑动返回手势屏蔽掉不就行了?如果我们想屏蔽掉Nav的rootViewController的滑动返回手势,那就需要我们自定义一个Nav,在Nav的手势代理方法gestureRecognizerShouldBegin中禁掉rootViewController的滑动返回手势。
    主要代码如下:

    @implementation MyNavigationController
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
       __weak typeof(self) weakself = self;
        if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
            self.interactivePopGestureRecognizer.delegate = (id)weakself;
        }
    }
    
    #pragma mark - UIGestureRecognizerDelegate
    - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
        if (gestureRecognizer == self.interactivePopGestureRecognizer) {
            // 屏蔽调用rootViewController的滑动返回手势
            if (self.viewControllers.count < 2 || self.visibleViewController == [self.viewControllers objectAtIndex:0]) {
                return NO;
            }
        }
        return YES;
    }
    @end
    
    

    相关文章

      网友评论

          本文标题:[iOS]解决重写UINavigationController导

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