Мое текущее приложение работает на iOS 5 и 6.
Панель навигации имеет оранжевый цвет, а строка состояния имеет черный цвет фона с белым цветом текста. Однако, когда я запускаю то же приложение на iOS 7, я вижу, что строка состояния выглядит прозрачной с тем же оранжевым цветом фона, что и панель навигации, а цвет текста строки состояния черный.
Из-за этого я не могу различить строку состояния и панель навигации.
Как сделать так, чтобы строка состояния выглядела так же, как в iOS 5 и 6, то есть с черным цветом фона и белым цветом текста? Как я могу сделать это программно?
ios
ios7
uicolor
ios-statusbar
Реджиш Раджан
источник
источник
Ответы:
================================================== ======================
Пришлось искать другие пути. Что не связано
addSubview
с окном. Потому что я двигаюсь вверх по окну, когда отображается клавиатура.Цель-C
- (void)setStatusBarBackgroundColor:(UIColor *)color { UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"]; if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) { statusBar.backgroundColor = color; } }
Swift
func setStatusBarBackgroundColor(color: UIColor) { guard let statusBar = UIApplication.sharedApplication().valueForKey("statusBarWindow")?.valueForKey("statusBar") as? UIView else { return } statusBar.backgroundColor = color }
Swift 3
func setStatusBarBackgroundColor(color: UIColor) { guard let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView else { return } statusBar.backgroundColor = color }
Вызов этой формы
application:didFinishLaunchingWithOptions
у меня сработал.NB. У нас есть приложение в магазине приложений с такой логикой. Так что я думаю, что с политикой магазина приложений все в порядке.
Редактировать:
Используйте на свой риск. Сформируйте комментатора @Sebyddd
источник
Перейдите к своему приложению
info.plist
1) Установите
View controller-based status bar appearance
значениеNO
2) Установите
Status bar style
значениеUIStatusBarStyleLightContent
Затем. Перейдите к делегату приложения и вставьте следующий код, в котором вы устанавливаете свой Windows RootViewController.
#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]; }
Надеюсь, это поможет.
источник
Status bar style
вариант. Выберите это. И вставьтеUIStatusBarStyleLightContent
как его значение.UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 20)];
UIApplication.sharedApplication().statusBarFrame
При обработке цвета фона строки состояния в iOS 7 есть 2 случая
Случай 1. Просмотр с помощью панели навигации
В этом случае используйте следующий код в своем методе 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];
Случай 2: просмотр без панели навигации
В этом случае используйте следующий код в своем методе 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];
Ссылка на источник http://code-ios.blogspot.in/2014/08/how-to-change-background-color-of.html
источник
1) установите UIViewControllerBasedStatusBarAppearance в YES в списке
2) in viewDidLoad сделать
[self setNeedsStatusBarAppearanceUpdate];
3) добавьте следующий метод:
-(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }
ОБНОВЛЕНИЕ:
также проверьте developers-guide-to-the-ios-7-status-bar
источник
Вы можете установить цвет фона для строки состояния во время запуска приложения или во время 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 } }
Вот результат:
Вот рекомендации Apple / инструкция по изменению строки состояния. В строке состояния разрешены только темный и светлый (пока и черный).
Вот - Как изменить стиль строки состояния:
Если вы хотите , чтобы стиль набора статуса бара, уровень приложений , а затем установить
UIViewControllerBasedStatusBarAppearance
вNO
вашей .plist»файла`.если вы хотите установить стиль строки состояния, на уровне контроллера представления выполните следующие действия:
UIViewControllerBasedStatusBarAppearance
значениеYES
в.plist
файле, если вам нужно установить стиль строки состояния только на уровне UIViewController.В функции добавления viewDidLoad -
setNeedsStatusBarAppearanceUpdate
переопределить предпочтительныйStatusBarStyle в вашем контроллере представления.
-
override func viewDidLoad() { super.viewDidLoad() self.setNeedsStatusBarAppearanceUpdate() } override var preferredStatusBarStyle: UIStatusBarStyle { return .lightContent }
источник
В iOS 7 строка состояния не имеет фона, поэтому, если вы поместите за ней черный вид высотой 20 пикселей, вы получите тот же результат, что и iOS 6.
Также вы можете прочитать Руководство по переходу на iOS 7 UI для получения дополнительной информации по этому вопросу.
источник
Напишите это в своем методе ViewDidLoad:
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { self.edgesForExtendedLayout=UIRectEdgeNone; self.extendedLayoutIncludesOpaqueBars=NO; self.automaticallyAdjustsScrollViewInsets=NO; }
Он исправил цвет строки состояния для меня и другие смещения пользовательского интерфейса в некоторой степени.
источник
Вот общее решение для копирования и вставки с
абсолютно правильное объяснение
по каждой проблеме.
С благодарностью Warif Akhand Rishi !
за удивительную находку, касающуюся keyPath
statusBarWindow.statusBar
. Хороший.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 }
источник
Просто чтобы добавить к ответу Шахида - вы можете учитывать изменения ориентации или разные устройства, используя это (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]; ... }
источник
для фона вы можете легко добавить вид, как в примере:
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];
где «navbar» - это UINavigationBar.
источник
Swift 4:
// Изменение цвета фона строки состояния
let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView statusBar?.backgroundColor = UIColor.red
источник
Изменить цвет фона строки состояния: Swift:
let proxyViewForStatusBar : UIView = UIView(frame: CGRectMake(0, 0,self.view.frame.size.width, 20)) proxyViewForStatusBar.backgroundColor=UIColor.whiteColor() self.view.addSubview(proxyViewForStatusBar)
источник
В случае с Swift 2.0 на iOS 9
Поместите следующее в делегат приложения в 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)
источник
Решение iTroid23 сработало для меня. Я пропустил решение Swift. Возможно, это будет полезно:
1) В моем листе мне пришлось добавить это:
<key>UIViewControllerBasedStatusBarAppearance</key> <true/>
2) Мне не нужно было вызывать setNeedsStatusBarAppearanceUpdate.
3) Мне пришлось быстро добавить это в свой UIViewController:
override func preferredStatusBarStyle() -> UIStatusBarStyle { return UIStatusBarStyle.LightContent }
источник
Если вы используете a
UINavigationController
, вы можете использовать такое расширение: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) } }
Это в основном делает фон панели навигации прозрачным и использует другой UIView в качестве фона. Вы можете вызвать
setNavigationBarBackground
метод своего контроллера навигации, чтобы установить цвет фона панели навигации вместе со строкой состояния.Имейте в виду, что затем вам нужно использовать
setNavigationBar(hidden: Bool, animated: Bool)
метод в расширении, если вы хотите скрыть панель навигации, иначе представление, которое использовалось в качестве фона, все равно будет отображаться.источник
Попробуй это. Используйте этот код в своей функции класса appdelegate
didFinishLaunchingWithOptions
:[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; [application setStatusBarHidden:NO]; UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"]; if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) { statusBar.backgroundColor = [UIColor blackColor]; }
источник
Приведенный ниже фрагмент кода должен работать с Objective 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 } }
источник
Для цвета полосы: вы предоставляете настраиваемое фоновое изображение для полосы.
Для цвета текста: используйте информацию в разделе Об обработке текста в iOS.
источник
Мне удалось настроить цвет StatusBar довольно просто, добавив
AppDelegate.cs
файл в метод:public override bool FinishedLaunching(UIApplication app, NSDictionary options)
следующий код:
UIView statusBar = UIApplication.SharedApplication.ValueForKey(new NSString("statusBar")) as UIView; if (statusBar!=null && statusBar.RespondsToSelector(new Selector("setBackgroundColor:"))) { statusBar.BackgroundColor = Color.FromHex(RedColorHex).ToUIColor(); }
Получается что-то вроде этого:
Ссылка: https://jorgearamirez.wordpress.com/2016/07/18/lesson-x-effects-for-the-status-bar/
источник
Swift 4
В
Info.plist
дополнение к этому свойствуПросмотр отображения строки состояния на основе контроллера на НЕТ
и после этого
AppDelegate
внутриdidFinishLaunchingWithOptions
добавьте эти строки кодаUIApplication.shared.isStatusBarHidden = false UIApplication.shared.statusBarStyle = .lightContent
источник
В Swift 5 и 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 } })
Здесь я исправил цвет фона строки состояния и цвет фона панели навигации. Если вы не хотите, чтобы цвет панели навигации закомментировал его.
источник
Код 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)
источник
Вы можете использовать, как показано ниже, для iOS 13 * и Swift 4.
1 -> Установите для отображения строки состояния на основе контроллера значение НЕТ
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 } }
использовать в didFinishLaunchingWithOptions
UIApplication.shared.statusBarView?.backgroundColor = UIColor.red
источник