如何为ios11设置不安全区域背景色
How to set unsafe area background color for ios 11
使用 xcode9 创建一些新的视图控制器,所以现在我有一些安全区域需要处理。
我目前正在尝试做一些完全证明,这意味着保持不安全区域的原样(因为我总是显示状态栏)并将背景颜色扩展到全屏(以保持与我使用的类似的行为有)。
另外请注意,这也会影响页面控件,因为当您有一些页面控件时,系统会将它们放在底部的不安全区域,该区域也将显示为黑色。
不过我找不到让背景颜色延伸到不安全区域后面的方法。
有什么想法吗?
您必须应用不同的约束。您的背景颜色应该一直延伸到安全区域之外,一直延伸到超级视图。因此,您的约束需要设置为背景颜色的超级视图,但要设置为 ui 视图的安全区域(按钮、tableView 等)
这看起来像是一个骇人听闻的把戏,但您可以试试这个:
您可以在应用程序启动期间或视图控制器的 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
}
}
这是结果:
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
}
最近在解决一个类似的问题。不同之处在于,在我看来,顶部的不安全区域必须被填充,而底部的不安全区域则不需要。另一个区别是我的背景视图实际上是在scrollView
中,这使得约束设置更加复杂。
我尝试了上面提到的 "statusBar"
解决方案,但是我想视图层次结构自 iOS 13 以来已经更改,因此这会导致崩溃。
最后我想出了解决问题的方案:
首先在视图控制器视图的最顶部添加状态栏背景视图,将其顶部、前导和尾部与安全区域的顶部、前导和尾部对齐(代码中的statusBarBgView
)。
同时,将原来的填充背景(bgView
)的顶部约束设置为Status Bar Bg View的底部。
然后在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,滚动时可以避免两个视图之间的间隙。
使用 xcode9 创建一些新的视图控制器,所以现在我有一些安全区域需要处理。
我目前正在尝试做一些完全证明,这意味着保持不安全区域的原样(因为我总是显示状态栏)并将背景颜色扩展到全屏(以保持与我使用的类似的行为有)。
另外请注意,这也会影响页面控件,因为当您有一些页面控件时,系统会将它们放在底部的不安全区域,该区域也将显示为黑色。
不过我找不到让背景颜色延伸到不安全区域后面的方法。 有什么想法吗?
您必须应用不同的约束。您的背景颜色应该一直延伸到安全区域之外,一直延伸到超级视图。因此,您的约束需要设置为背景颜色的超级视图,但要设置为 ui 视图的安全区域(按钮、tableView 等)
这看起来像是一个骇人听闻的把戏,但您可以试试这个:
您可以在应用程序启动期间或视图控制器的 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
}
}
这是结果:
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
}
最近在解决一个类似的问题。不同之处在于,在我看来,顶部的不安全区域必须被填充,而底部的不安全区域则不需要。另一个区别是我的背景视图实际上是在scrollView
中,这使得约束设置更加复杂。
我尝试了上面提到的 "statusBar"
解决方案,但是我想视图层次结构自 iOS 13 以来已经更改,因此这会导致崩溃。
最后我想出了解决问题的方案:
首先在视图控制器视图的最顶部添加状态栏背景视图,将其顶部、前导和尾部与安全区域的顶部、前导和尾部对齐(代码中的statusBarBgView
)。
同时,将原来的填充背景(bgView
)的顶部约束设置为Status Bar Bg View的底部。
然后在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,滚动时可以避免两个视图之间的间隙。