Moja obecna aplikacja działa na iOS 5 i 6.
Pasek nawigacji ma kolor pomarańczowy, a pasek stanu czarne tło z białym kolorem tekstu. Jednak gdy uruchamiam tę samą aplikację na iOS 7, obserwuję, że pasek stanu wygląda na przezroczysty z tym samym pomarańczowym kolorem tła co pasek nawigacji, a tekst paska stanu jest czarny.
Z tego powodu nie jestem w stanie odróżnić paska stanu od paska nawigacji.
Jak sprawić, by pasek stanu wyglądał tak samo, jak w iOS 5 i 6, czyli z czarnym tłem i białym kolorem tekstu? Jak mogę to zrobić programowo?
ios
ios7
uicolor
ios-statusbar
Rejeesh Rajan
źródło
źródło
Odpowiedzi:
==================================================== ======================
Musiałem szukać innych sposobów. Który nie dotyczy
addSubview
okna. Ponieważ przesuwam okno w górę, gdy wyświetlana jest klawiatura.Cel C
- (void)setStatusBarBackgroundColor:(UIColor *)color { UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"]; if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) { statusBar.backgroundColor = color; } }
Szybki
func setStatusBarBackgroundColor(color: UIColor) { guard let statusBar = UIApplication.sharedApplication().valueForKey("statusBarWindow")?.valueForKey("statusBar") as? UIView else { return } statusBar.backgroundColor = color }
Szybki 3
func setStatusBarBackgroundColor(color: UIColor) { guard let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView else { return } statusBar.backgroundColor = color }
Wywołanie tego formularza
application:didFinishLaunchingWithOptions
zadziałało dla mnie.NB Mamy aplikację w sklepie z aplikacjami z tą logiką. Więc myślę, że jest to w porządku z polityką sklepu z aplikacjami.
Edytować:
Używaj na własne ryzyko. Utwórz komentatora @Sebyddd
źródło
Przejdź do swojej aplikacji
info.plist
1) Ustaw
View controller-based status bar appearance
naNO
2) Ustaw
Status bar style
naUIStatusBarStyleLightContent
Następnie przejdź do delegata aplikacji i wklej następujący kod, w którym ustawisz RootViewController systemu 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]; }
Mam nadzieję, że to pomoże.
źródło
Status bar style
opcję. Wybierz to. I wklejUIStatusBarStyleLightContent
jako jego wartość.UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 20)];
UIApplication.sharedApplication().statusBarFrame
Podczas obsługi koloru tła paska stanu w iOS 7 istnieją 2 przypadki
Przypadek 1: Widok z paskiem nawigacji
W takim przypadku użyj następującego kodu w swojej metodzie viewDidLoad
UIApplication *app = [UIApplication sharedApplication]; CGFloat statusBarHeight = app.statusBarFrame.size.height; UIView *statusBarView = [[UIView alloc] initWithFrame:CGRectMake(0, -statusBarHeight, [UIScreen mainScreen].bounds.size.width, statusBarHeight)]; statusBarView.backgroundColor = [UIColor yellowColor]; [self.navigationController.navigationBar addSubview:statusBarView];
Przypadek 2: Widok bez paska nawigacji
W takim przypadku użyj następującego kodu w swojej metodzie viewDidLoad
UIApplication *app = [UIApplication sharedApplication]; CGFloat statusBarHeight = app.statusBarFrame.size.height; UIView *statusBarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, statusBarHeight)]; statusBarView.backgroundColor = [UIColor yellowColor]; [self.view addSubview:statusBarView];
Link do źródła http://code-ios.blogspot.in/2014/08/how-to-change-background-color-of.html
źródło
1) ustaw UIViewControllerBasedStatusBarAppearance na YES w plist
2) w viewDidLoad wykonaj a
[self setNeedsStatusBarAppearanceUpdate];
3) dodaj następującą metodę:
-(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }
AKTUALIZACJA:
sprawdź także przewodnik-dla programistów po pasku stanu-ios-7
źródło
Możesz ustawić kolor tła paska stanu podczas uruchamiania aplikacji lub podczas viewDidLoad kontrolera widoku.
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 } }
Oto wynik:
Oto wytyczne Apple / instrukcja dotycząca zmiany paska stanu. Na pasku stanu dozwolone są tylko ciemne i jasne (podczas gdy i czarne).
Oto - Jak zmienić styl paska stanu:
Jeśli chcesz Ustaw status bar w stylu, następnie ustaw poziom aplikacji
UIViewControllerBasedStatusBarAppearance
doNO
w .plist”pliku`.jeśli chcesz ustawić styl paska stanu, na poziomie kontrolera widoku wykonaj następujące kroki:
UIViewControllerBasedStatusBarAppearance
sięYES
w.plist
pliku, jeśli trzeba ustawić status bar w stylu tylko na poziomie UIViewController.W funkcji add viewDidLoad -
setNeedsStatusBarAppearanceUpdate
Zastąp preferowanyStatusBarStyle w kontrolerze widoku.
-
override func viewDidLoad() { super.viewDidLoad() self.setNeedsStatusBarAppearanceUpdate() } override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
źródło
W iOS 7 pasek stanu nie ma tła, więc jeśli umieścisz za nim czarny widok o wysokości 20 pikseli, osiągniesz ten sam wynik, co iOS 6.
Możesz również zapoznać się z Przewodnikiem przejścia na interfejs użytkownika w iOS 7, aby uzyskać dalsze informacje na ten temat.
źródło
Napisz to w swojej metodzie ViewDidLoad:
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { self.edgesForExtendedLayout=UIRectEdgeNone; self.extendedLayoutIncludesOpaqueBars=NO; self.automaticallyAdjustsScrollViewInsets=NO; }
Naprawiono w pewnym stopniu kolor paska stanu dla mnie i innych błędów interfejsu użytkownika.
źródło
Oto rozwiązanie typu „kopiuj i wklej” z rozszerzeniem
absolutnie poprawne wyjaśnienie
każdego problemu.
Z podziękowaniami dla Warif Akhand Rishi !
za niesamowite znalezisko dotyczące keyPath
statusBarWindow.statusBar
. Dobry.func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // handle the iOS bar! // >>>>>NOTE<<<<< // >>>>>NOTE<<<<< // >>>>>NOTE<<<<< // "Status Bar Style" refers to the >>>>>color of the TEXT<<<<<< of the Apple status bar, // it does NOT refer to the background color of the bar. This causes a lot of confusion. // >>>>>NOTE<<<<< // >>>>>NOTE<<<<< // >>>>>NOTE<<<<< // our app is white, so we want the Apple bar to be white (with, obviously, black writing) // make the ultimate window of OUR app actually start only BELOW Apple's bar.... // so, in storyboard, never think about the issue. design to the full height in storyboard. let h = UIApplication.shared.statusBarFrame.size.height let f = self.window?.frame self.window?.frame = CGRect(x: 0, y: h, width: f!.size.width, height: f!.size.height - h) // next, in your plist be sure to have this: you almost always want this anyway: // <key>UIViewControllerBasedStatusBarAppearance</key> // <false/> // next - very simply in the app Target, select "Status Bar Style" to Default. // Do nothing in the plist regarding "Status Bar Style" - in modern Xcode, setting // the "Status Bar Style" toggle simply sets the plist for you. // finally, method A: // set the bg of the Apple bar to white. Technique courtesy Warif Akhand Rishi. // note: self.window?.clipsToBounds = true-or-false, makes no difference in method A. if let sb = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView { sb.backgroundColor = UIColor.white // if you prefer a light gray under there... //sb.backgroundColor = UIColor(hue: 0, saturation: 0, brightness: 0.9, alpha: 1) } /* // if you prefer or if necessary, method B: // explicitly actually add a background, in our app, to sit behind the apple bar.... self.window?.clipsToBounds = false // MUST be false if you use this approach let whiteness = UIView() whiteness.frame = CGRect(x: 0, y: -h, width: f!.size.width, height: h) whiteness.backgroundColor = UIColor.green self.window!.addSubview(whiteness) */ return true }
źródło
Aby dodać do odpowiedzi Shahida - możesz uwzględnić zmiany orientacji lub różne urządzenia za pomocą tego (iOS7 +):
- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { ... //Create the background UIView* statusBg = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.window.frame.size.width, 20)]; statusBg.backgroundColor = [UIColor colorWithWhite:1 alpha:.7]; //Add the view behind the status bar [self.window.rootViewController.view addSubview:statusBg]; //set the constraints to auto-resize statusBg.translatesAutoresizingMaskIntoConstraints = NO; [statusBg.superview addConstraint:[NSLayoutConstraint constraintWithItem:statusBg attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:statusBg.superview attribute:NSLayoutAttributeTop multiplier:1.0 constant:0.0]]; [statusBg.superview addConstraint:[NSLayoutConstraint constraintWithItem:statusBg attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:statusBg.superview attribute:NSLayoutAttributeLeft multiplier:1.0 constant:0.0]]; [statusBg.superview addConstraint:[NSLayoutConstraint constraintWithItem:statusBg attribute:NSLayoutAttributeRight relatedBy:NSLayoutRelationEqual toItem:statusBg.superview attribute:NSLayoutAttributeRight multiplier:1.0 constant:0.0]]; [statusBg.superview addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[statusBg(==20)]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(statusBg)]]; [statusBg.superview setNeedsUpdateConstraints]; ... }
źródło
do tła można łatwo dodać widok, jak na przykład:
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0,320, 20)]; view.backgroundColor = [UIColor colorWithRed:0/255.0 green:0/255.0 blue:0/255.0 alpha:0.1]; [navbar addSubview:view];
gdzie „navbar” to UINavigationBar.
źródło
Swift 4:
// Zmień kolor tła paska stanu
let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView statusBar?.backgroundColor = UIColor.red
źródło
Zmień kolor tła paska stanu: Swift:
let proxyViewForStatusBar : UIView = UIView(frame: CGRectMake(0, 0,self.view.frame.size.width, 20)) proxyViewForStatusBar.backgroundColor=UIColor.whiteColor() self.view.addSubview(proxyViewForStatusBar)
źródło
W przypadku Swift 2.0 na iOS 9
Umieść następujące elementy w delegacie aplikacji w obszarze didFinishLaunchingWithOptions:
let view: UIView = UIView.init(frame: CGRectMake(0, 0, UIScreen.mainScreen().bounds.size.width, 20)) view.backgroundColor = UIColor.blackColor() //The colour you want to set view.alpha = 0.1 //This and the line above is set like this just if you want the status bar a darker shade of the colour you already have behind it. self.window!.rootViewController!.view.addSubview(view)
źródło
Rozwiązanie iTroid23 działało u mnie. Brakowało mi rozwiązania Swift. Więc może to jest pomocne:
1) W swoim plistie musiałem dodać to:
<key>UIViewControllerBasedStatusBarAppearance</key> <true/>
2) Nie musiałem wywoływać „setNeedsStatusBarAppearanceUpdate”.
3) Szybko musiałem dodać to do mojego UIViewController:
override func preferredStatusBarStyle() -> UIStatusBarStyle { return UIStatusBarStyle.LightContent }
źródło
Jeśli używasz
UINavigationController
rozszerzenia, możesz użyć takiego rozszerzenia:extension UINavigationController { private struct AssociatedKeys { static var navigationBarBackgroundViewName = "NavigationBarBackground" } var navigationBarBackgroundView: UIView? { get { return objc_getAssociatedObject(self, &AssociatedKeys.navigationBarBackgroundViewName) as? UIView } set(newValue) { objc_setAssociatedObject(self, &AssociatedKeys.navigationBarBackgroundViewName, newValue, .OBJC_ASSOCIATION_RETAIN) } } func setNavigationBar(hidden isHidden: Bool, animated: Bool = false) { if animated { UIView.animate(withDuration: 0.3) { self.navigationBarBackgroundView?.isHidden = isHidden } } else { navigationBarBackgroundView?.isHidden = isHidden } } func setNavigationBarBackground(color: UIColor, includingStatusBar: Bool = true, animated: Bool = false) { navigationBarBackgroundView?.backgroundColor = UIColor.clear navigationBar.backgroundColor = UIColor.clear navigationBar.barTintColor = UIColor.clear let setupOperation = { if includingStatusBar { self.navigationBarBackgroundView?.isHidden = false if self.navigationBarBackgroundView == nil { self.setupBackgroundView() } self.navigationBarBackgroundView?.backgroundColor = color } else { self.navigationBarBackgroundView?.isHidden = true self.navigationBar.backgroundColor = color } } if animated { UIView.animate(withDuration: 0.3) { setupOperation() } } else { setupOperation() } } private func setupBackgroundView() { var frame = navigationBar.frame frame.origin.y = 0 frame.size.height = 64 navigationBarBackgroundView = UIView(frame: frame) navigationBarBackgroundView?.translatesAutoresizingMaskIntoConstraints = true navigationBarBackgroundView?.autoresizingMask = [.flexibleWidth, .flexibleBottomMargin] navigationBarBackgroundView?.isUserInteractionEnabled = false view.insertSubview(navigationBarBackgroundView!, aboveSubview: navigationBar) } }
Zasadniczo sprawia, że tło paska nawigacji jest przezroczyste i używa innego UIView jako tła. Możesz wywołać
setNavigationBarBackground
metodę kontrolera nawigacji, aby ustawić kolor tła paska nawigacji wraz z paskiem stanu.Pamiętaj, że musisz wtedy użyć
setNavigationBar(hidden: Bool, animated: Bool)
metody w rozszerzeniu, gdy chcesz ukryć pasek nawigacji, w przeciwnym razie widok, który był używany jako tło, będzie nadal widoczny.źródło
Spróbuj tego. Użyj tego kodu w
didFinishLaunchingWithOptions
funkcji klasy appdelegate :[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; [application setStatusBarHidden:NO]; UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"]; if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) { statusBar.backgroundColor = [UIColor blackColor]; }
źródło
Poniższy fragment kodu powinien działać z celem C.
if (@available(iOS 13.0, *)) { UIView *statusBar = [[UIView alloc]initWithFrame:[UIApplication sharedApplication].keyWindow.windowScene.statusBarManager.statusBarFrame] ; statusBar.backgroundColor = [UIColor whiteColor]; [[UIApplication sharedApplication].keyWindow addSubview:statusBar]; } else { // Fallback on earlier versions UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"]; if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) { statusBar.backgroundColor = [UIColor whiteColor];//set whatever color you like } }
źródło
W przypadku koloru paska: zapewniasz niestandardowy obraz tła paska.
Kolor tekstu: skorzystaj z informacji zawartych w artykule Obsługa tekstu w systemie iOS
źródło
Udało mi się dostosować kolor StatusBar dość prosto, dodając
AppDelegate.cs
plik w metodzie:public override bool FinishedLaunching(UIApplication app, NSDictionary options)
następny kod:
UIView statusBar = UIApplication.SharedApplication.ValueForKey(new NSString("statusBar")) as UIView; if (statusBar!=null && statusBar.RespondsToSelector(new Selector("setBackgroundColor:"))) { statusBar.BackgroundColor = Color.FromHex(RedColorHex).ToUIColor(); }
Więc dostajesz coś takiego:
Link: https://jorgearamirez.wordpress.com/2016/07/18/lesson-x-effects-for-the-status-bar/
źródło
Szybki 4
W
Info.plist
dodać tę właściwośćWyświetl wygląd paska stanu opartego na kontrolerze na NIE
a następnie w
AppDelegate
środkudidFinishLaunchingWithOptions
dodaj te wiersze koduUIApplication.shared.isStatusBarHidden = false UIApplication.shared.statusBarStyle = .lightContent
źródło
W Swift 5 i Xcode 10.2
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(0.1 * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: { //Set status bar background colour let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView statusBar?.backgroundColor = UIColor.red //Set navigation bar subView background colour for view in controller.navigationController?.navigationBar.subviews ?? [] { view.tintColor = UIColor.white view.backgroundColor = UIColor.red } })
Tutaj naprawiłem kolor tła paska stanu i kolor tła paska nawigacji. Jeśli nie chcesz, aby kolor paska nawigacji został skomentowany.
źródło
Kod SWIFT
let statusBarView = UIView(frame: CGRect(x: 0, y: 0, width: view.width, height: 20.0)) statusBarView.backgroundColor = UIColor.red self.navigationController?.view.addSubview(statusBarView)
źródło
Możesz używać jak poniżej, dla iOS 13 * i Swift 4.
1 -> Ustaw wygląd paska stanu kontrolera widoku na NIE
extension UIApplication { var statusBarView: UIView? { if #available(iOS 13.0, *) { let statusBar = UIView() statusBar.frame = UIApplication.shared.statusBarFrame UIApplication.shared.keyWindow?.addSubview(statusBar) return statusBar } else { let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView return statusBar } }
użyj w didFinishLaunchingWithOptions
UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
źródło