我一直在开发一个iOS应用程序,该应用程序在iOS 13之前可以在弹出窗口出现时使状态栏“变暗”,只需添加一个以边界为状态栏的视图并应用.5的字母:
lazy var fadeStatusBar: UIView = {
let fadeStatusBar = UIView(frame: UIApplication.shared.statusBarView?.frame ?? UIApplication.shared.statusBarFrame)
fadeStatusBar.backgroundColor = UIColor.black
fadeStatusBar.alpha = 0
fadeStatusBar.translatesAutoresizingMaskIntoConstraints = false
return fadeStatusBar
}()
statusBarView
是UIApplication的扩展:
extension UIApplication {
var statusBarView: UIView? {
if #available(iOS 13.0, *) {
let tag = 38482458385
if let statusBar = self.keyWindow?.viewWithTag(tag) {
return statusBar
} else {
let statusBarView = UIView(frame: UIApplication.shared.statusBarFrame)
statusBarView.tag = tag
self.keyWindow?.addSubview(statusBarView)
return statusBarView
}
} else {
if responds(to: Selector(("statusBar"))) {
return value(forKey: "statusBar") as? UIView
}
}
return nil
}
}
然后我可以将fadeStatusBar alpha属性设置为.5动画。但是,这在iOS 13中不再起作用。我只是想知道是否仍然有可能实现,因为我在another thread中读到,本机iOS应用程序也删除了此功能:
状态栏由系统进程呈现(在应用程序外部) 进程)在iOS 13上运行,因此应用无法更改此设置。 (来源:在WWDC 2019实验室与UIKit工程师交谈。)
您可以在Apple Books应用程序中看到此内容,该应用程序以前使状态变暗 在iOS 12上处于黑暗模式时出现竖线,但这在iOS 13上不会发生。
我的问题与上面提到的问题有所不同,因为存在的问题是编辑状态栏本身的Alpha,而我很乐意使用覆盖视图。任何实现预期结果的建议将不胜感激。
答案 0 :(得分:0)
您可以尝试创建另一个UIWindow
实例并将其level
属性设置为statusBar
或alert
。
链接有关UIWindow
级别的Apple文档:https://developer.apple.com/documentation/uikit/uiwindow/level/
答案 1 :(得分:0)
您可以添加视图并使其变暗并将其作为子视图添加到状态栏,如下所示:
// Dim status bar
let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
let wFrame = window?.windowScene?.statusBarManager?.statusBarFrame
let statusBarView = UIView(frame: wFrame!)
statusBarView.restorationIdentifier = "statusBarView"
statusBarView.backgroundColor = UIColor.black.withAlphaComponent(0.6)
window?.addSubview(statusBarView)
如果你想恢复它,你可以做如下:
// Revert status bar back to normal
let window = UIApplication.shared.windows.filter {$0.isKeyWindow}.first
for subview in window!.subviews {
if subview.restorationIdentifier == "statusBarView" {
subview.removeFromSuperview()
}
}