Изменение цвета строки состояния для определенных ViewControllers с помощью Swift в iOS8
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return UIStatusBarStyle.LightContent;
}
Использование приведенного выше кода в любом ViewController для установки цвета statusBar на Белый для определенного viewcontroller не работает в iOS8 для меня. Какие-либо предложения? Используя метод UIApplication.sharedApplication, цвет меняется после необходимых изменений в Info.plist для всего приложения.
// Change the colour of status bar from black to white
UIApplication.sharedApplication().statusBarStyle = .LightContent
Как я могу просто внести изменения в цвет строки состояния для некоторых необходимых и определенных ViewControllers?
26 ответов
ПРЕДУПРЕЖДЕНИЕ
Сеттер для statusBarStyle устарел в iOS 9.0: Использование -[UIViewController предпочитаемый StatusBarStyle]
UIApplication.shared.statusBarStyle = .default
поэтому мое решение было следующим: создание расширения из контроллера навигации:
extension UINavigationController {
open override var preferredStatusBarStyle: UIStatusBarStyle {
if let topViewController = presentedViewController{
return topViewController.preferredStatusBarStyle
}
if let topViewController = viewControllers.last {
return topViewController.preferredStatusBarStyle
}
return .default
}
}
и если у вас есть viewController, который будет иметь другой стиль, чем стиль приложения, вы можете сделать это
var barStyle = UIStatusBarStyle.lightContent
override var preferredStatusBarStyle: UIStatusBarStyle{
return barStyle
}
скажем, что стиль вашего приложения .default
и вы хотите, чтобы этот экран был .lightContent
так что barStyle возьмет .lightContent
в качестве значения по умолчанию это изменит стиль строки состояния на lightContent, а затем убедитесь, что viewWillDisappear
снова измените barStyle на стиль строки состояния приложения, который в нашем случае .default
,
это работает для меня
Работает для навигации на основе конкретного контроллера представления в swift4
let app = UIApplication.shared
let statusBarHeight: CGFloat = app.statusBarFrame.size.height
let statusbarView = UIView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.size.width, height: statusBarHeight))
statusbarView.backgroundColor = UIColor.red
view.addSubview(statusbarView)
Для Xcode 10 вы можете создать класс и поместить его перед вашим классом viewController, вы можете вызвать этот класс во всех контроллерах представления, нужна легкая строка состояния контента...
class UIViewControllerWithLightStatusBar: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return UIStatusBarStyle.lightContent
}
}
Теперь измените ваш класс viewController в:
class YourViewController: UIViewControllerWithLightStatusBar {
...
}
И это все...
Я буквально попал в этот же вопрос. У меня ушло более 4 часов, чтобы понять это. Я перепробовал все ответы, приведенные здесь, и лучшее, что я получил, было получить заголовок строки состояния белого цвета. Но другие биты, такие как батарейный блок и другие, все еще были черными, независимо от того, что я сделал: относительно применения всех решений, представленных в этом вопросе. Поэтому я решил вернуться к своим шагам и узнал, что я загрузил зависимость CocoaPod, которая изменяла обычные функции Xcode и коды для изменения цвета. Для меня это была зависимость "ChameleonFramework". Поэтому я бы посоветовал вам проверить свои зависимости, которые вы установили с CocoaPods, удалив самые последние из них, если вы применили все решения и не работаете на вас.
По состоянию на октябрь 2020 г., Swift 5, Xcode 12
Если вы хотите установить его для всех контроллеров представления в приложении. и если в вашем приложении есть контроллер навигации.
Свифт 3
В вашем AppDelegate
файл внутри func application
метод
let statusBar: UIView = application.value(forKey: "statusBar") as! UIView
statusBar.backgroundColor = .red
Если кто-то хочет изменить батарею и цвет текста в строке состояния, как на изображении ниже:
вы можете использовать следующий код в классе appdelegate.
UINavigationBar.appearance().barTintColor = UIColor(red: 234.0/255.0, green: 46.0/255.0, blue: 73.0/255.0, alpha: 1.0)
UINavigationBar.appearance().tintColor = UIColor.white
UINavigationBar.appearance().titleTextAttributes = [NSAttributedString.Key.foregroundColor : UIColor.white]
Swift 4.0 Пожалуйста, используйте этот код в "didFinishLaunchingWithOptions launchOptions:" Класс Appdelegate
UIApplication.shared.statusBarStyle = .lightContent let statusBar: UIView = UIApplication.shared.value(forKey: "statusBar") as! UIView if statusBar.responds(to: #selector(setter: UIView.backgroundColor)){ statusBar.backgroundColor = UIColor.black }