在iOS13中,我无法再更改状态栏的背景颜色,因为无法使用“键值”来访问状态栏。 有没有人知道这是怎么可能的,或者是否知道在iOS13的最终版本中这是可能的?
我遇到了不同的建议,例如使用UIApplications StatusBarView(在xcode 11,beta 7中不再可用)或使用statusbarmanager。两者都不能访问状态栏。
let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
statusBar.backgroundColor = <Some Color>
}
我希望状态栏能够获得所需的背景颜色。
答案 0 :(得分:4)
在首选的ViewController上使用它
override func viewDidAppear(_ animated: Bool) {
if #available(iOS 13, *)
{
let statusBar = UIView(frame: (UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame)!)
statusBar.backgroundColor = UIColor.systemBackground
UIApplication.shared.keyWindow?.addSubview(statusBar)
}
}
您可以在“ UIColor.systemBackground”中使用颜色
答案 1 :(得分:3)
如果您不使用NavigationController,则可以在ViewController中设置基本视图的背景颜色
view.backgroundColor = .blue
答案 2 :(得分:2)
使用UIStatusBarManager的目标C版本:
UIView *statusBar = [[UIView alloc]initWithFrame:[UIApplication sharedApplication].keyWindow.windowScene.statusBarManager.statusBarFrame] ;
statusBar.backgroundColor = [UIColor whiteColor];
[[UIApplication sharedApplication].keyWindow addSubview:statusBar]
答案 3 :(得分:1)
如果您有导航栏
self.navigationBar.barTintColor = UIColor.blue
or
UINavigationBar.appearance().barTintColor = UIColor.blue
如果没有导航栏
view.backgroundColor = UIColor.blue
如果您的背景是网络视图
webView.scrollView.backgroundColor = UIColor.blue
我可能还有更多的失踪案
答案 4 :(得分:1)
代码适用于Swift 5+和iOS 13 +
要更改StatusBar背景色,我创建了UIViewController的基类,以便可以在所有视图控制器中继承相同的代码。
在UIViewController扩展中添加了“ statusBarColorChange()”。
extension UIViewController {
func statusBarColorChange() {
if #available(iOS 13.0, *) {
let statusBar = UIView(frame: UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.windowScene?.statusBarManager?.statusBarFrame ?? CGRect.zero)
statusBar.backgroundColor = .appNavigationThemeColor
statusBar.tag = 100
UIApplication.shared.windows.filter {$0.isKeyWindow}.first?.addSubview(statusBar)
} else {
let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
statusBar?.backgroundColor = .appNavigationThemeColor
}
} }
创建基类并在其他类中继承。
class BaseClass: UIViewController {
override func viewWillAppear(_ animated: Bool) {
self.statusBarColorChange()
}
}
class ChatListViewController: BaseClass {}
希望会有所帮助:)
答案 5 :(得分:0)
let appearance = UINavigationBarAppearance()
appearance.backgroundColor = .blue
self.navigationController?.navigationBar.scrollEdgeAppearance = appearance
我希望这会对您有所帮助。
答案 6 :(得分:0)
尝试一下
import API from "../../utils/API";
componentDidMount() {
let merchantId = this.props.merchant.id;
let api = new API(this.props.gatheredTokens);
let self = this;
api.setRetry(10);
api
.get("merchantMessages", { repl_str: merchantId })
.then(response => this.merchantMessageConfiguration(response.data))
.catch(function (error) {
console.log(error);
})
.then(function () {
self.state.list.push(
<Card
merchant={self.props.merchant}
key={self.props.merchant.id}
bubblemsg={self.state.bubblemsg}
/>
);
})
.then(function () {
self.merchantNoticeLoading(self);
});
}
答案 7 :(得分:0)
在基本视图控制器中调用此
public extension UIViewController {
func setStatusBar(color: UIColor) {
let tag = 12321
if let taggedView = self.view.viewWithTag(tag){
taggedView.removeFromSuperview()
}
let overView = UIView()
overView.frame = UIApplication.shared.statusBarFrame
overView.backgroundColor = color
overView.tag = tag
self.view.addSubview(overView)
}
}
答案 8 :(得分:0)
我正在使用中央ThemeManager类,在其中设置所有UI颜色。这就是我解决的方法。您可以选择满足您需求的部分解决方案:
let sharedApplication = UIApplication.shared
sharedApplication.delegate?.window??.tintColor = setYourColor
if #available(iOS 13.0, *) {
let statusBar = UIView(frame: (sharedApplication.delegate?.window??.windowScene?.statusBarManager?.statusBarFrame)!)
statusBar.backgroundColor = setYourColor
sharedApplication.delegate?.window??.addSubview(statusBar)
} else {
// Fallback on earlier versions
sharedApplication.statusBarView?.backgroundColor = setYourColor
}
extension UIApplication {
var statusBarView: UIView? {
return value(forKey: "statusBar") as? UIView
}
}
答案 9 :(得分:0)
JaspreetKour 的回答有效;但是,为其他视图控制器重置状态栏颜色可能非常困难(特别是如果您需要状态栏下方的图像内容)。将颜色设置为 .clear 不起作用。
一个更简单的解决方案是清除导航栏:
navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationController?.navigationBar.shadowImage = UIImage()
navigationController?.navigationBar.backgroundColor = .clear
navigationController?.navigationBar.isTranslucent = true
然后向视图控制器添加一个 UIView(将背景颜色设置为您需要的颜色)并将其约束设置为超级视图的最顶部(而不是边距)。
使用这种技术,您的颜色将显示在状态栏下方,您无需弄乱 statusBarManager(其属性都是只读的)。
答案 10 :(得分:-2)
if let statusBar = UIStatusBarManager.self as? UIView {
if statusBar.responds(to: #selector(setter: UIView.backgroundColor)) {
statusBar.backgroundColor = #colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
}
}
我希望这对您有用