it-roy-ru.com

цвет фона строки пользовательского состояния iOS не отображается

Я пытаюсь заполнить цвет фона строки состояния до оранжевого, используя следующие

UINavigationBar.appearance().tintColor = UIColor.orangeColor()
UINavigationBar.appearance().barTintColor = UIColor.orangeColor()
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)

Тем не менее, я получаю белую строку состояния, которая должна быть заполнена оранжевым вместо следующего примера: Настройка внешнего вида панели навигации с помощью Swift

Я устанавливаю это в файле AppDelegate.Swift в методе didFinishLaunchingWithOptions, чтобы применить его ко всему приложению. 

Я отредактировал свой info.plist следующим образом: View controller-based status bar appearance => NO 

Кто-нибудь знает, что я делаю не так?

Правка: я не уверен, если это имеет значение, но представление находится в UITabBarController 

Правка 2: На самом деле это происходит во всех представлениях, а не только в UITabBarController.

Правка 3: Спасибо @Utsav Парих 

Теперь я добавляю представление поверх строки состояния, и оно на короткое время, пока приложение загружает строку состояния, оранжевого цвета, но как только оно завершает загрузку, оно выталкивается из представления и заменяется общей белой строкой состояния. Почему это происходит?

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.mainScreen().bounds.size.width, height: 20.0))
view.backgroundColor=UIColor.orangeColor()
self.window!.rootViewController!.view.addSubview(view) 

Редактировать для Swift 3:

с UITabBarController

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.size.width, height: 20.0))
view.backgroundColor = .orange
self.view.addSubview(view)

Без встроенных контроллеров

Я понимаю, что некоторые люди приходят сюда не только за строкой состояния, но на самом деле за панель навигации, поэтому я научился нескольким приемам, чтобы сделать это без каких-либо встроенных контроллеров:

Добавьте этот метод в ваш AppDelegate.Swift и вызовите его в didFinishLaunchingWithOptions

func customizeAppearance() {
    UINavigationBar.appearance().barTintColor = UIColor.black
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
    UITabBar.appearance().barTintColor = UIColor.black
    let tintColor = UIColor(red: 255/255.0, green: 255/255.0, blue: 255/255.0, alpha: 1.0)

    UITabBar.appearance().tintColor = tintColor
}
15
Simon

Редактировать для Swift 3 :

С UITabBarController

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.size.width, height: 20.0))
view.backgroundColor = .orange
self.view.addSubview(view)

Без встроенных контроллеров

Я понимаю, что некоторые люди приходят сюда не только за строкой состояния, но на самом деле за панель навигации, поэтому я научился нескольким приемам, чтобы сделать это без каких-либо встроенных контроллеров:

Добавьте этот метод в ваш AppDelegate.Swift и вызовите его в didFinishLaunchingWithOptions

func customizeAppearance() {
    UINavigationBar.appearance().barTintColor = UIColor.black
    UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName: UIColor.white]
    UITabBar.appearance().barTintColor = UIColor.black
    let tintColor = UIColor(red: 255/255.0, green: 255/255.0, blue: 255/255.0, alpha: 1.0)

    UITabBar.appearance().tintColor = tintColor
}

Благодаря @Utsav я добавил следующее подпредставление в мой UITabBarController и теперь это работает: 

    let view = UIView(frame:
                    CGRect(x: 0.0, y: 0.0, width: UIScreen.mainScreen().bounds.size.width, height: 20.0)
                )
    view.backgroundColor = UIColor.orangeColor()

    self.view.addSubview(view)

UITabBarController , похоже, не очень хорошо работает в AppDelegate . Если у кого-то есть лучший способ, дайте мне знать, но на данный момент это решение, к которому я пришел.

26
Simon

Добавьте этот код в didFinishLaunchingWithOptions в AppDelegate

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.mainScreen().bounds.size.width, height: 20.0))
view.backgroundColor=UIColor.orangeColor()
self.window.rootViewController.view.addSubview(view)

Надеюсь, это поможет вам .... !!!

16
Utsav Parikh

Вот как я это сделал, не добавляя представления в VC с помощью NavBarController

Я хотел, чтобы цвет строки состояния совпадал с цветом представления VC, поэтому я просто написал:

override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.grayColor()
    self.navigationController?.navigationBar.clipsToBounds = true
}

Попытайся.

6
naz

Ответ Саймона в Swift 3

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.size.width, height: 20.0))
view.backgroundColor = .orange
self.view.addSubview(view)

Есть еще один способ, который я знаю, который использует частный API. Это имеет некоторые преимущества, когда меняется ориентация, отображается клавиатура и вид перемещается вверх. Я использовал его и каждый раз мне везло (приложение было выпущено в магазине приложений).

func setStatusBarBackgroundColor(color: UIColor) {

    guard let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView else { return }

    statusBar.backgroundColor = color
} 
1
Warif Akhand Rishi

После того, что вы сделали в info.plist следующее: View controller-based status bar appearance => NO.

Добавьте этот код в файл AppDelegate.Swift под didFinishLaunchingWithOptions:

var navigationBarAppearace = UINavigationBar.appearance()

navigationBarAppearace.tintColor = uicolorFromHex(0xffffff)
navigationBarAppearace.barTintColor = uicolorFromHex(0x2E9AFE)

// change navigation item title color
navigationBarAppearace.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor()]

UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent

и вы можете выбрать любой шестнадцатеричный код для вашего выбора цвета .. !! Наслаждаться..!!

Извините, забыл использовать hexcode, он вам также понадобится, поэтому добавьте этот код в любое место вашего AppDelegate.Swift:

func uicolorFromHex(rgbValue:UInt32)->UIColor {

    let red = CGFloat((rgbValue & 0xFF0000) >> 16)/256.0

    let green = CGFloat((rgbValue & 0xFF00) >> 8)/256.0

    let blue = CGFloat(rgbValue & 0xFF)/256.0

    return UIColor(red:red, green:green, blue:blue, alpha:1.0)
}
1
Irshad Qureshi

Я думаю, что ваша последняя строка отменяет ваши изменения, попробуйте это:

override func viewWillAppear(animated: Bool) {
UIApplication.sharedApplication().setStatusBarStyle(UIStatusBarStyle.LightContent, animated: true)
        super.viewWillAppear(animated)
        var nav = self.navigationController?.navigationBar
        nav?.barStyle = UIBarStyle.Black
        nav?.tintColor = UIColor.orangeColor()
        nav?.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.whiteColor()]
    }
1
Icaro

UINavigationBar.appereance() работает для будущих viewController, но не для текущего отображаемого rootViewController. Чтобы достичь этого, я добавил следующее в свою didFinishLaunchingWithOptions:

UINavigationBar.appearance().tintColor = myColor

let navigationController = UIApplication.sharedApplication().windows[0].rootViewController as! UINavigationController
navigationController.navigationBar.barTintColor = myColor
navigationController.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName : myTextColor]
navigationController.navigationBar.translucent = false

navigationController.setNeedsStatusBarAppearanceUpdate()
0
zisoft

Основное различие заключается в tintColor и изменении цвета фона UINavigationBar. На мой взгляд, лучший способ - применить фоновое изображение, сделанное квадратным изображением размером в 1 пиксель только одного цвета.
Как это:

let tabbarAndNavBarBkg = UIImage(named: "nav_tab")
UINavigationBar.appearance().setBackgroundImage(tabbarAndNavBarBkg, forBarMetrics: .Default) 

Или вы можете создать категорию в UIColor для возврата UIImage для данного экземпляра UIColor в objC:

+ (UIImage *) imageWithColor:(UIColor*) color {
    CGRect rect = CGRectMake(0, 0, 1, 1);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);
    UIImage *colorImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return colorImage;
}
0
Andrea

Swift 3:

В своем файле AppDelegate.Swift вставьте приведенный ниже код в ваш didFinishLaunchingWithOptions метод:

let view = UIView(frame: CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.size.width, height: 20.0))
view.backgroundColor = UIColor(red: 255/255, green: 130/255, blue: 0/255, alpha: 1.0) // Organge colour in RGB
self.window?.rootViewController?.view.addSubview(view)

Это прекрасно работает для меня!

0
Bruno Campos