在滚动视图中动态隐藏状态栏时滞后/屏幕冻结(Swift 3)

Dev*_*per 6 statusbar uiscrollview uiviewcontroller swift swift3

我目前正在使用Scroll View不同的页面.我的目标是隐藏Status Bar在一个特定的页面上.有一个非常烦人的滞后,每次重新出现/消失时屏幕都会冻结Status Bar.

这是我的方法:

首先,我定义了两个变量

private var currentPage = 0

private var isStatusBarPreferablyHidden = true
Run Code Online (Sandbox Code Playgroud)

然后我使用Scroll View Delegate中的两个函数setNeedsStatusBarAppearanceUpdate在用户滑动到第一页时调用

func scrollViewDidScroll(_ scrollView: UIScrollView) {

    let currentScrollPosition : CGFloat = self.navigation.contentOffset.x / self.navigation.frame.size.width
    currentPage = lroundf(Float(currentScrollPosition))
}

func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {

    if currentPage == 0 {

        isStatusBarPreferablyHidden = true
    } else {

        isStatusBarPreferablyHidden = false
    }

    self.setNeedsStatusBarAppearanceUpdate()
}
Run Code Online (Sandbox Code Playgroud)

最后,我覆盖状态栏功能以更新状态栏的外观.

override var prefersStatusBarHidden: Bool {

    return isStatusBarPreferablyHidden
}

override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {

    return UIStatusBarAnimation.none
}
Run Code Online (Sandbox Code Playgroud)

季亨达*_*季亨达 0

消除scrollViewWillBeginDecelerating。尝试:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let currentScrollPosition : CGFloat = scrollView.contentOffset.x / scrollView.frame.size.width
    let page = lroundf(Float(currentScrollPosition))
    if page != currentPage {
        currentPage = page
        if currentPage == 0 {
            isStatusBarPreferablyHidden = true
        } else {
            isStatusBarPreferablyHidden = false
        }
        self.setNeedsStatusBarAppearanceUpdate()
    }
}
Run Code Online (Sandbox Code Playgroud)