美文网首页
【iOS开发】Push时,画面卡住

【iOS开发】Push时,画面卡住

作者: 代码搬运小萌新 | 来源:发表于2019-11-08 11:05 被阅读0次

背景

使用leftBarButtonItem实现自定义返回按钮,从而导致侧滑返回失效。
为了解决侧滑返回失效的问题,在UIViewController中执行,

navigationController?.interactivePopGestureRecognizer?.delegate = self

侧滑问题解决,
目前的层级结构为,UINavigationController中包含一个或多个UIViewController

Bug复现

  1. 进入UINavigationControllerrootViewController
  2. 执行侧滑手势
  3. 点击按钮,该按钮执行push操作
  4. 画面卡住

解决方案

最终使用这个解决方案,如下

extension UINavigationController:UINavigationControllerDelegate {

    open override func viewDidLoad() {
        super.viewDidLoad()
        self.delegate = self
    }

    public func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
        if responds(to: #selector(getter: self.interactivePopGestureRecognizer)) {
            if viewControllers.count > 1 {
                interactivePopGestureRecognizer?.isEnabled = true
            } else {
                interactivePopGestureRecognizer?.isEnabled = false
            }
        }
    }
}

过程与思考

在最终确定解决方案之前,我做了一个尝试,试图理解这个问题,

当在UIViewController中执行如下代码时,

navigationController?.interactivePopGestureRecognizer?.delegate = nil

可以侧滑,bug依然存在。可以猜想,将delegate置为selfnil,都是一样的。可能是interactivePopGestureRecognizer有默认实现,这个默认实现能够完成侧滑功能,但是没有处理rootViewController的情况。

其他解决方案

当然,还有另一种解决思路,

var originDelegate: UIGestureRecognizerDelegate?

// replace
originDelegate = interactivePopGestureRecognizer?.delegate
interactivePopGestureRecognizer?.delegate = self

// restore later
interactivePopGestureRecognizer?.delegate = originDelegate

相关文章

网友评论

      本文标题:【iOS开发】Push时,画面卡住

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