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

Posted

技术标签:

【中文标题】在滚动视图中动态隐藏状态栏时滞后/屏幕冻结(Swift 3)【英文标题】:Lag / Screen Freezes when hiding Status Bar dynamically in a Scroll View (Swift 3) 【发布时间】:2017-04-16 16:36:15 【问题描述】:

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

这是我的方法:

首先我定义了两个变量

private var currentPage = 0

private var isStatusBarPreferablyHidden = true

然后,当用户滑动到第一页时,我使用 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()

最后我重写了状态栏函数来更新状态栏的外观。

override var prefersStatusBarHidden: Bool 

    return isStatusBarPreferablyHidden


override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation 

    return UIStatusBarAnimation.none

【问题讨论】:

【参考方案1】:

删除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()
    

【讨论】:

这根本不会改变任何东西!同样的滞后,甚至不能正常工作。很抱歉,但这个答案并不能解决任何问题-.- @Devapploper 滞后是什么意思。我测试你的代码。改成scrollViewWillBeginDragging 后就好了。 每当状态栏即将改变时,滚动视图和所有其他内容都会冻结大约 1/2 秒。这与使用的委托方法无关 @Devapploper 看看我的解决方案是否符合您的要求。 非常感谢您的帮助,并且您的代码可以正常工作,就像我的一样。但这不是重点。我发布这个问题的原因是,从带有状态栏的视图转换到没有状态栏的视图会导致屏幕冻结一点。这个答案并不能解决问题,但我非常感谢您的努力和帮助! :)

以上是关于在滚动视图中动态隐藏状态栏时滞后/屏幕冻结(Swift 3)的主要内容,如果未能解决你的问题,请参考以下文章

列表视图滚动时在屏幕底部隐藏线性布局

如何在滚动时隐藏导航栏,除非在屏幕顶部

UIScrollView 在导航和状态栏下方移动

同时状态栏隐藏和视图转换

如何修复为啥在 Xcode 中 ScrollView 后面有状态栏空间?

隐藏 NavBar 但显示带背景的状态栏