Изменение строки состояния Цвет фона в Swift 3
В XCode 7.3.x плохо изменил цвет фона для моего StatusBar с помощью:
func setStatusBarBackgroundColor(color: UIColor) {
guard let statusBar = UIApplication.sharedApplication().valueForKey("statusBarWindow")?.valueForKey("statusBar") as? UIView else {
return
}
statusBar.backgroundColor = color
}
Но похоже, что это не работает с Swift 3.0.
Пробовал с помощью:
func setStatusBarBackgroundColor(color: UIColor) {
guard let statusBar = (UIApplication.shared.value(forKey: "statusBarWindow") as AnyObject).value(forKey: "statusBar") as? UIView else {
return
}
statusBar.backgroundColor = color
}
Но это дает мне:
this class is not key value coding-compliant for the key statusBar.
Любые идеи, как изменить его с помощью XCode8/Swift 3.0?
Ответы
Ответ 1
extension UIApplication {
var statusBarView: UIView? {
if responds(to: Selector(("statusBar"))) {
return value(forKey: "statusBar") as? UIView
}
return nil
}
}
UIApplication.shared.statusBarView?.backgroundColor = .red
Обновление для iOS 13
Приложение называется -statusBar или -statusBar Window на UIApplication: этот код должен быть изменен, так как больше нет строки состояния или строки состояния окно. Вместо этого используйте объект statusBarManager на сцене окна.
См. Как изменить цвет фона строки состояния и текста на iOS 13?
Ответ 2
Цвет фона строки состояния "Изменить":
let statusBarView = UIView(frame: UIApplication.shared.statusBarFrame)
let statusBarColor = UIColor(red: 32/255, green: 149/255, blue: 215/255, alpha: 1.0)
statusBarView.backgroundColor = statusBarColor
view.addSubview(statusBarView)
Изменить цвет текста строки состояния:
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Обновление: обратите внимание, что рамка строки состояния будет меняться при повороте вида. Вы можете обновить созданный кадр подпредставления:
- Использование маски авторазмера:
statusBarView.autoresizingMask = [.flexibleWidth,.flexibleTopMargin]
- Наблюдение
NSNotification.Name.UIApplicationWillChangeStatusBarOrientation
- Или переопределение
viewWillLayoutSubviews()
Ответ 3
Используя Swift 3 и 4, вы можете использовать фрагмент кода ниже. Он находит представление из UIApplication
используя valueForKeyPath
качестве установленного для него цвета фона.
guard let statusBarView = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView else {
return
}
statusBarView.backgroundColor = UIColor.red
Objective-C
UIView *statusBarView = [UIApplication.sharedApplication valueForKeyPath:@"statusBarWindow.statusBar"];
if (statusBarView != nil)
{
statusBarView.backgroundColor = [UIColor redColor];
}
Ответ 4
Для Xcode 9 и iOS 11: стиль строки состояния, которую мы попытаемся достичь, это строка состояния с белым содержимым. Перейдите в файл ViewController.swift и добавьте следующие строки кода.
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Или в настройках проекта вы можете изменить стиль строки состояния:
![enter image description here]()
Затем вернитесь к раскадровке, выберите View Controller и в меню редактора выберите Embed in Navigation Controller. Выберите панель навигации и в инспекторе атрибутов установите цвет "Оттенок панели" на красный. Раскадровка будет выглядеть следующим образом. ![enter image description here]()
Создайте и запустите проект. Содержимое строки состояния снова становится темным, что является значением по умолчанию. Причина этого заключается в том, что iOS запросила стиль строки состояния контроллера навигации вместо содержимого контроллера представления.
![enter image description here]()
Чтобы изменить стиль всех контроллеров навигации внутри приложения, измените следующий метод в файле AppDelegate.swift.
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
UINavigationBar.appearance().barStyle = .blackOpaque
return true
}
Снова создайте и запустите проект, на этот раз содержимое строки состояния изменилось на белый.
![enter image description here]()
Ответ 5
Для iOS 11 и Xcode 9 используйте следующие шаги.
-
создайте расширение для класса UIApplication:
extension UIApplication { var statusBarView: UIView? { return value(forKey: "statusBar") as? UIView } }
-
В вашем классе или там, где вы хотите изменить цвет фона строки состояния:
UIApplication.shared.statusBarView?.backgroundColor =.red
-
Для светлого или темного содержимого строки состояния просто перейдите в Info.plist и добавьте следующую строку значений со значением NO.
Просмотр внешнего вида строки состояния контроллера
- Теперь просто установите светлый контент или все, что вам нужно, на вкладке "Общие" в настройках вашего проекта.
Ответ 6
Попробуйте
Перейти к вашему приложению info.plist
- Установить вид состояния на основе контроллера на NO
- Установите стиль строки состояния в UIStatusBarStyleLightContent
Затем перейдите к своему делегату приложения и вставьте следующий код, где вы устанавливаете свой RootViewController Windows.
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
UIView *view=[[UIView alloc] initWithFrame:CGRectMake(0, 0,[UIScreen mainScreen].bounds.size.width, 20)];
view.backgroundColor=[UIColor blackColor];
[self.window.rootViewController.view addSubview:view];
}
Ответ 7
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any] ?) -> Bool {
// Override point for customization after application launch.
UINavigationBar.appearance().barStyle = .blackOpaque
return true
}
Это работает для меня, так как моя навигационная панель TintColor была черной и не могла видеть строку состояния.
При установке вышеуказанного кода строка состояния didFinishLaunch отображается белым цветом.
Ответ 8
Вы можете установить цвет фона для строки состояния во время запуска приложения или во время viewDidLoad вашего контроллера представления.
extension UIApplication {
var statusBarView: UIView? {
return value(forKey: "statusBar") as? UIView
}
}
// 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.red
return true
}
}
or
// 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.red
}
}
Вот результат:
![enter image description here]()
Ответ 9
Возможное решение - добавить представление, которое будет использоваться в качестве фона statusBar на вашем viewController:
let frame = screenController.view.convert(UIApplication.shared.statusBarFrame, to: screenController.view)
let backview = UIView(frame: frame)
backview.backgroundColor = backgroundColor
screenController.view.addSubview(backview)
screenController.view.bringSubviewToFront(backview)
Ответ 10
Добавьте следующий код в свой файл расширения для редактирования строки состояния в swift 4 и выше:
extension UIApplication {
var statusBarView: UIView? {
if responds(to: Selector(("statusBar"))) {
return value(forKey: "statusBar") as? UIView
}
return nil
}
}
Теперь мы можем отредактировать строку состояния, добавив следующую строку в наш класс ViewController:
UIApplication.shared.statusBarView?.backgroundColor = <Your Color name>
ex: UIApplication.shared.statusBarView?.backgroundColor = .red
Надеюсь, это будет полезно. Спасибо
Ответ 11
Правильное решение для Swift 4+ и iOS 13+
if #available(iOS 13.0, *) {
let navBarAppearance = UINavigationBarAppearance()
navBarAppearance.configureWithOpaqueBackground()
navBarAppearance.titleTextAttributes = [.foregroundColor: UIColor.white]
navBarAppearance.largeTitleTextAttributes = [.foregroundColor: UIColor.white]
navBarAppearance.backgroundColor = UIColor.Theme.primary
navigationBar.standardAppearance = navBarAppearance
navigationBar.scrollEdgeAppearance = navBarAppearance
}
![enter image description here]()
Ответ 12
Я сделал это расширение, чтобы изменить цвет строки состояния. Это не зависит от ключа.
Так что гораздо безопаснее использовать
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)
}
}
Вот использование в любом месте viewcontroller:
setStatusBar(color: .red)
Ответ 13
У меня есть собственное решение для изменения строки состояния на iOS 13 и ниже. Вот как это сделать:
if #available(iOS 13.0, *) {
let app = UIApplication.shared
let statusBarHeight: CGFloat = app.statusBarFrame.size.height
let statusbarView = UIView()
statusbarView.backgroundColor = UIColor.red
view.addSubview(statusbarView)
statusbarView.translatesAutoresizingMaskIntoConstraints = false
statusbarView.heightAnchor
.constraint(equalToConstant: statusBarHeight).isActive = true
statusbarView.widthAnchor
.constraint(equalTo: view.widthAnchor, multiplier: 1.0).isActive = true
statusbarView.topAnchor
.constraint(equalTo: view.topAnchor).isActive = true
statusbarView.centerXAnchor
.constraint(equalTo: view.centerXAnchor).isActive = true
} else {
let statusBar = UIApplication.shared.value(forKeyPath:
"statusBarWindow.statusBar") as? UIView
statusBar?.backgroundColor = UIColor.red
}
Также ознакомьтесь со статьей iOS 13 Как изменить цвет StatusBar?
И последнее, вы все еще можете изменить стиль строки состояния с помощью:
override var preferredStatusBarStyle : UIStatusBarStyle {
return UIStatusBarStyle.lightContent
//return UIStatusBarStyle.default // Make dark again
}