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

Posted

技术标签:

【中文标题】如何修复为啥在 Xcode 中 ScrollView 后面有状态栏空间?【英文标题】:How to fix why status bar space behind ScrollView in Xcode?如何修复为什么在 Xcode 中 ScrollView 后面有状态栏空间? 【发布时间】:2018-07-14 12:07:23 【问题描述】:

我在我的视图中添加了一个滚动视图,它悬停在状态栏上(我把它隐藏了)。滚动视图工作正常,但是当我滚动到顶部时,我有一个空白区域,当我点击屏幕时它会消失,当我向下滚动然后顶部时会再次出现。

我注意到滚动条没有到我的视图顶部,而是停在状态栏。

这里有一些截图可以告诉你我的意思。

我在视图顶部,但滚动条不在:

这是与再次滚动顶部时出现的白色状态栏相同的视图:

当我点击屏幕或向下滚动时它会消失。

这是我的限制:

我认为是 Layout Margin 或类似的问题,但我不应该更改什么?

我像这样在视图控制器中隐藏状态栏:

override func viewWillAppear(_ animated: Bool) 
    UIApplication.shared.keyWindow?.windowLevel = UIWindowLevelStatusBar

    super.viewWillAppear(animated)

编辑:即使我评论隐藏状态栏的行,我的滚动视图仍然存在同样的问题。所以问题不在于我如何隐藏它。

【问题讨论】:

尝试在滚动视图上将内容插入更改为“从不”。 【参考方案1】:

正如Sam 所说,我在滚动视图上将content insets 更改为“从不”,它可以正常工作。

【讨论】:

【参考方案2】:

虽然与您的问题无关,但我必须对您隐藏状态栏的方式做出反应 - 正确的方法是在您的视图控制器中覆盖 prefersStatusBarHidden 并在您的 viewWillAppear 中调用 self.setNeedsStatusBarAppearanceUpdate()

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)

    self.setNeedsStatusBarAppearanceUpdate()


override var prefersStatusBarHidden: Bool 
    return true

更新

由于您的视图控制器位于 UINavigationViewController 内部,因此您需要覆盖 UINavigationViewController 中的 childViewControllerForStatusBarHidden 以使用 visibleViewController 作为控制器来确定隐藏状态栏(我将覆盖添加到 childViewControllerForStatusBarStyle 以保持一致性):

extension UINavigationController 
    open override var childViewControllerForStatusBarStyle: UIViewController? 
        return visibleViewController
    

    open override var childViewControllerForStatusBarHidden: UIViewController? 
        return visibleViewController
    

【讨论】:

可以但是这个方法不行,我已经试过了……不过这里不是问题 @cusmar 它有效,我刚刚尝试过.. 如果它不适合你,那只是意味着你没有正确地做某事.. 是 BorneVC @987654332 的 rootViewController @?如果不是,它是如何呈现的? 如何检查? BorneVC 是一个连接到导航控制器的视图控制器。此导航控制器以模态方式呈现,全屏,垂直覆盖。我不知道这是否是件好事,因为当我在 BorneVC 之后添加一个新的视图控制器,并将一个按钮从 BorneVC 连接到它时,我的新视图控制器似乎也显示为模态(垂直),而不是经典的表演过渡。你知道什么会导致这个错误吗? 我应该把扩展放在哪里?在我的 BorneVC 文件中? @cusmar 要么创建一个新的swift文件,要么在BorneVC的类定义之后

以上是关于如何修复为啥在 Xcode 中 ScrollView 后面有状态栏空间?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Alamofire 编译错误?

如何在重新启动 xcode 7.1 时修复丢失的约束

如何修复:Xcode 9 构建循环直到退出代码 255

Xcode 7.0.1 - 无效的 Swift 支持 - cocoapods 如何修复?

如何修复 xcode 苹果配置的“丢失私钥”?

如何修复 install_name_tool:无法在 xcode 10.2 中打开文件