如何为iOS11设置不安全区域背景色

wko9yo5t  于 12个月前  发布在  iOS
关注(0)|答案(5)|浏览(117)

用xcode 9创建一些新的视图控制器,所以现在我有一些安全的区域要处理。
我目前正试图做一些完全证明,这意味着保持不安全的区域,因为它是(因为我总是显示状态栏),并有背景颜色扩展到全屏(保持类似的行为,我曾经有)。
另外,这也会影响页面控件,因为当你有一些页面控件时,系统会将它们放在底部的不安全区域,这些区域也会显示为黑色。
我无法找到一种方法,为背景颜色,以扩大背后的不安全的地区,虽然。有什么想法吗?

8yparm6h

8yparm6h1#

它看起来像一个黑客的把戏,但你可以试试这个:
您可以在应用程序启动期间或视图控制器的viewDidLoad期间设置状态栏的背景颜色。在这里,它以以下方式为我工作。

extension UIApplication {

    var statusBarView: UIView? {
        return value(forKey: "statusBar") as? UIView
    }

}

// Set it from your view controller if you've view controller based statusbar
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        UIApplication.shared.statusBarView?.backgroundColor = UIColor.green
    }

}

or

// Set upon application launch, if you've application based status bar
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
        UIApplication.shared.statusBarView?.backgroundColor = UIColor.green
        return true
    }
}

结果如下:

laawzig2

laawzig22#

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

jyztefdp

jyztefdp3#

最近我在解决一个类似的问题。不同的是,在我看来,顶部的不安全区域必须填补,而底部的不需要。另一个区别是,我的背景视图实际上是在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
    }
}

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

2w3kk1z5

2w3kk1z54#

对于那些仍然在寻找这个问题的人。我最简单的解决方案是创建一个uiview并约束它

private let containerView: UIView = {
    let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.backgroundColor = //Your background color you want present
    return view
}()

然后以这种方式限制它。设置bottomSafeArea(或topSafeArea)

containerView.topAnchor.constraint(equalTo: view.topAnchor),
        containerView.leftAnchor.constraint(equalTo: view.leftAnchor),
        containerView.rightAnchor.constraint(equalTo: view.rightAnchor),
        containerView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),

最后给它上色

containerView.backgroundColor = //Color you want to set
hl0ma9xz

hl0ma9xz5#

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
    }

相关问题