如何为ios 11设置不安全的区域背景颜色

时间:2017-10-03 10:08:21

标签: ios swift ios11 xcode9 safearealayoutguide

使用xcode 9创建一些新的视图控制器,现在我有几个安全区域需要处理。

我目前正在尝试做一些全面的保护,这意味着保持不安全区域(因为我总是显示状态栏)并将背景颜色延伸到全屏(以保持与我以前相似的行为) )。

另外请注意,这也会影响页面控件,因为当你有一些时,系统会把它们放在底部不安全的区域,这个区域也会以黑色显示。

我找不到让背景颜色延伸到不安全区域后面的方法。 有什么想法吗?

4 个答案:

答案 0 :(得分:16)

它看起来像一个hacky技巧,但你可以试试这个:
您可以在应用程序启动期间或视图控制器的viewDidLoad期间为状态栏设置背景颜色。这对我有用,方法如下。

osgiCfgInit.sh



结果如下:

enter image description here

答案 1 :(得分:7)

您必须应用不同的约束。您的背景颜色应该超出安全区域一直延伸到superview。因此,您的约束需要设置为背景颜色的superview,而不是ui视图的安全区域(按钮,tableViews等)

答案 2 :(得分:0)

    if #available(iOS 13.0, *) {
        let navBarAppearance = UINavigationBarAppearance()
        navBarAppearance.configureWithTransparentBackground()
        navBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.white]
        navBarAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white]
        navBarAppearance.backgroundColor = .black
        navigationController?.navigationBar.standardAppearance = navBarAppearance
        navigationController?.navigationBar.scrollEdgeAppearance = navBarAppearance
    }

答案 3 :(得分:0)

最近我正在解决一个类似的问题。不同之处在于,在我看来,顶部的不安全区域必须被填充,而底部的则不需要。另一个区别是我的背景视图实际上是在 scrollView 中,这使得约束设置更加复杂。

我尝试了上面提到的 "statusBar" 解决方案,但是我猜自 iOS 13 以来视图层次结构已经改变,因此这会导致崩溃。

最后我提出了解决问题的解决方案:

首先在视图控制器视图的最顶部添加状态栏Bg视图,将其顶部、前导和尾部对齐到安全区域的顶部、前导和尾部(代码中的statusBarBgView)。 同时,将原始填充背景(bgView)的顶部约束设置为状态栏 Bg 视图的底部。

然后在 viewDidLoad() 中,调用以下方法:

private func fillSafeAreaIfNeeded() {
    if let _ = UIApplication.shared.keyWindow?.safeAreaInsets.top {
        statusBarBgView.translatesAutoresizingMaskIntoConstraints = false
        statusBarBgView.topAnchor.constraint(equalTo: view!.topAnchor).isActive = true // This line fills up status bar
        bgView.topAnchor.constraint(equalTo: statusBarBgView!.bottomAnchor).isActive = true
    }
    else {
        statusBarBgView.frame = CGRect.zero
    }
}

请注意,通过使用 bgView 的 bottomAnchor 约束 statusBarBgView 的 topAnchor,可以在滚动时避免两个视图之间的间隙。