【问题标题】:scrollViewDidScroll crash when calling self.setNeedsStatusBarAppearanceUpdate() in iOS 11在 iOS 11 中调用 self.setNeedsStatusBarAppearanceUpdate() 时 scrollViewDidScroll 崩溃
【发布时间】:2017-09-27 03:24:35
【问题描述】:

我有这个方法

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView is GLIndexedCollectionView { return }

    if scrollView.contentOffset.y >= 120 && self.navBarHidden == true {
        self.navBarHidden = false
        self.setNeedsStatusBarAppearanceUpdate()

        self.topTvConstraint.constant = 44.0
        self.view.layoutIfNeeded()

        self.navigationBarConstraint.constant = 65

        UIView.animate(withDuration: 0.2, delay: 0.0, options: .curveEaseOut, animations: {
            self.view.layoutIfNeeded()
            }, completion: nil)

        var scrollBounds = self.tv.bounds
        scrollBounds.origin = CGPoint(x: 0, y: 185)
        self.tv.bounds = scrollBounds

    }
}

想法是动画一个顶部栏并改变状态栏颜色,所以我使用 setNeedsStatusBarAppearanceUpdate 来

override var preferredStatusBarStyle: UIStatusBarStyle {
    if navBarHidden {
        return .lightContent
    }

    return .default 
}

但是....如果我在 Xcode 9 中编译并在带有 iOS 11 的真实设备或模拟器中运行它,它会在这一行崩溃

self.setNeedsStatusBarAppearanceUpdate()

如果我尝试 iOS 10.3 按预期运行,为什么?请帮忙!

【问题讨论】:

  • 你必须检查设备版本才能调用这个方法
  • 但该方法在 iOS11 中并没有被弃用,不是吗?
  • 检查我的答案,这在项目中对我有用,所以我与你分享

标签: ios swift3 ios11


【解决方案1】:
if #available(iOS 11.0, *) {
    setNeedsUpdateOfScreenEdgesDeferringSystemGestures()
} else {
    setNeedsStatusBarAppearanceUpdate()
}

注意:这是 iOS 11 中一个很小但很重要的变化。如果您依赖隐藏状态栏来使用屏幕边缘的手势,您应该更新您的应用并覆盖 iOS 11 的 setNeedsUpdateOfScreenEdgesDeferringSystemGestures

【讨论】:

  • 所以这是强制重新评估 override var preferredStatusBarStyle: UIStatusBarStyle 的新方法?现在,我知道另一段代码,但这里是同一个块崩溃的一部分! self.view.layoutIfNeeded() 发生了什么?你从哪里得到这个信息?顺便说一句,感谢您的帮助
  • useyourloaf.com/blog/… 从这里@goseta
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多