web-dev-qa-db-de.com

die Hintergrundfarbe der benutzerdefinierten iOS-Statusleiste wird nicht angezeigt

Ich versuche, die Hintergrundfarbe der Statusleiste mit den folgenden Punkten orange zu füllen

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

Ich erhalte jedoch eine weiße Statusleiste, die stattdessen mit Orange gefüllt werden sollte, wenn Sie dieses Beispiel verwenden: Mit Swift das Aussehen der Navigationsleiste anpassen

Ich stelle dies in der AppDelegate.Swift -Datei unter didFinishLaunchingWithOptions ein, um es auf die gesamte App anzuwenden. 

Ich habe meine info.plist wie folgt bearbeitet: View controller-based status bar appearance => NO 

Weiß jemand, was ich falsch mache?

Edit: Ich bin mir nicht sicher, ob es wichtig ist, aber die Ansicht befindet sich in einem UITabBarController

Edit 2: Dies geschieht eigentlich in allen Ansichten, nicht nur im UITabBarController.

Edit 3: Danke @Utsav Parikh 

Ich füge jetzt eine Ansicht über der Statusleiste hinzu, und zwar für einen kurzen Moment, während die App die Statusleiste orange lädt. Sobald sie jedoch vollständig geladen ist, wird sie von der Ansicht weggedrückt und durch die generische weiße Statusleiste ersetzt. Warum sollte das passieren?

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) 

Bearbeiten für Swift 3:

mit 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)

Ohne eingebettete Controller

Ich weiß, dass einige Leute nicht nur wegen der Statusleiste hierher kommen, sondern tatsächlich der Navigationsleiste. Daher habe ich auf dem Weg ein paar Tricks gelernt, um dies ohne eingebettete Controller zu tun:

Fügen Sie diese Methode in Ihre AppDelegate.Swift ein und rufen Sie sie in der didFinishLaunchingWithOptions auf.

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

Bearbeiten für Swift 3 :

Mit 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)

Ohne eingebettete Controller

Ich weiß, dass einige Leute nicht nur wegen der Statusleiste hierher kommen, sondern tatsächlich der Navigationsleiste. Daher habe ich auf dem Weg ein paar Tricks gelernt, um dies ohne eingebettete Controller zu tun:

Fügen Sie diese Methode in Ihre AppDelegate.Swift ein und rufen Sie sie in der didFinishLaunchingWithOptions auf.

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
}

Dank @Utsav habe ich meinem UITabBarController die folgende Unteransicht hinzugefügt und dies scheint jetzt zu funktionieren: 

    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)

Der UITabBarController scheint in AppDelegate nicht gut zu spielen. Wenn jemand einen besseren Weg hat, lass es mich wissen, aber jetzt ist dies die Lösung, zu der ich gekommen bin.

26
Simon

Fügen Sie diesen Code in didFinishLaunchingWithOptions in AppDelegate hinzu

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)

Hoffe es hilft dir .... !!!

16
Utsav Parikh

So habe ich es gemacht, ohne eine Ansicht in einem VC mit einem NavBarController hinzuzufügen

Ich wollte, dass die Farbe der Statusleiste der Ansichtsfarbe VC entspricht, also schrieb ich:

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

Versuch es.

6
naz

Simons Antwort in 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)

Es gibt einen anderen Weg, den ich kenne, der private API verwendet. Dies hat einige Vorteile, wenn die Orientierungsänderungen und die Tastatur angezeigt und die Ansicht nach oben verschoben wird. Ich habe es benutzt und hatte jedes Mal Glück (App wurde im App Store veröffentlicht).

func setStatusBarBackgroundColor(color: UIColor) {

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

    statusBar.backgroundColor = color
} 
1

Nach dem, was Sie in info.plist gemacht haben: View controller-based status bar appearance => NO.

Fügen Sie diesen Code in der AppDelegate.Swift-Datei unter didFinishLaunchingWithOptions hinzu:

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

und Sie können einen beliebigen Hex-Code für Ihre Farbauswahl auswählen. !! Genießen..!!

Entschuldigung, ich habe vergessen, den Hexcode zu verwenden, diesen Code benötigen Sie ebenfalls. Fügen Sie diesen Code an einer beliebigen Stelle in Ihrem AppDelegate.Swift ein:

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

Ich denke, Ihre letzte Zeile macht Ihre Änderungen rückgängig. Versuchen Sie Folgendes:

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() funktioniert für kommende viewControllers, jedoch nicht für den aktuell angezeigten rootViewController. Um dies zu erreichen, habe ich meiner didFinishLaunchingWithOptions folgendes hinzugefügt:

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

Es gibt einen Hauptunterschied zwischen tintColor und dem Ändern der Hintergrundfarbe von UINavigationBar. Der beste Weg ist meiner Meinung nach, ein Hintergrundbild anzuwenden, das aus einem 1-Pixel-Quadratbild mit nur einer Farbe besteht.
So wie das:

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

Oder Sie können eine Kategorie für UIColor erstellen, um eine UIImage mit einer UIColor-Instanz in objC zurückzugeben:

+ (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:

Fügen Sie in Ihrer AppDelegate.Swift-Datei den folgenden Code in Ihre didFinishLaunchingWithOptions -Methode ein:

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)

Das funktioniert gut für mich!

0
Bruno Campos