it-swarm.com.ru

Как изменить цвет фона строки состояния и текста на iOS 7?

Мое текущее приложение работает на iOS 5 и 6. 

Панель навигации имеет оранжевый цвет, а строка состояния - черный фон с белым цветом текста. Однако, когда я запускаю то же самое приложение на iOS 7, я вижу, что строка состояния выглядит прозрачной с тем же оранжевым цветом фона, что и панель навигации, а цвет строки состояния - черный. 

Из-за этого я не могу различить строку состояния и панель навигации. 

Как сделать так, чтобы строка состояния выглядела так же, как это было в iOS 5 и 6, то есть с черным цветом фона и белым цветом текста? Как я могу сделать это программно?

76
Rejeesh Rajan

Пришлось искать другие пути. Который не включает addSubview в окне. Потому что я двигаюсь вверх по окну, когда представлена ​​клавиатура.

Цель С

- (void)setStatusBarBackgroundColor:(UIColor *)color {

    UIView *statusBar = [[[UIApplication sharedApplication] valueForKey:@"statusBarWindow"] valueForKey:@"statusBar"];

    if ([statusBar respondsToSelector:@selector(setBackgroundColor:)]) {
        statusBar.backgroundColor = color;
    }
}

Стриж

func setStatusBarBackgroundColor(color: UIColor) {

    guard  let statusBar = UIApplication.sharedApplication().valueForKey("statusBarWindow")?.valueForKey("statusBar") as? UIView else {
        return
    }

    statusBar.backgroundColor = color
}

Свифт 3

func setStatusBarBackgroundColor(color: UIColor) {

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

    statusBar.backgroundColor = color
}

Вызов этой формы application:didFinishLaunchingWithOptions сработал для меня.

Нотабене У нас есть приложение в магазине приложений с этой логикой. Так что я думаю, что это нормально с политикой магазина приложений. 


Правка:

Используйте на свой риск. Форма комментатора @Sebyddd

У меня было одно приложение отклонено по этой причине, в то время как другое было принято просто хорошо. Они считают это частным использованием API, поэтому вы подвержены удачи в процессе рецензирования :) - Sebyddd

168
Warif Akhand Rishi

Перейти к вашему приложению info.plist 

1) Установите для View controller-based status bar appearance значение NO
2) Установите для Status bar style значение UIStatusBarStyleLightContent 

Затем перейдите к делегату приложения и вставьте следующий код, где вы устанавливаете RootViewController для 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];
}

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

106
Shahid Iqbal

1) установите для UIViewControllerBasedStatusBarAppearance значение YES в списке

2) в viewDidLoad сделать [self setNeedsStatusBarAppearanceUpdate];

3) добавить следующий метод:

 -(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
 } 

Обновление:
также проверьте руководство разработчика по строке состояния ios-7

27
Muruganandham K

При обработке цвета фона строки состояния в 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

25
Teja Kumar Bethina

В iOS 7 строка состояния не имеет фона, поэтому, если вы поместите за ней черное представление высотой 20px, вы получите тот же результат, что и в iOS 6.

Также вы можете прочитать Руководство по переходу с iOS 7 для получения дополнительной информации по этому вопросу.

14
Gabriele Petronella

Вы можете установить цвет фона для строки состояния во время запуска приложения или во время 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
    }

}



Вот результат:

enter image description here


Вот Apple Guidelines/Instruction об изменении строки состояния. Только темные и светлые (в то время как и черные) разрешены в строке состояния.

Вот - Как изменить стиль строки состояния:

Если вы хотите установить стиль строки состояния, уровень приложения, то установите UIViewControllerBasedStatusBarAppearance в NO в вашем файле `.plist '.

если вы хотите установить стиль строки состояния, на уровне контроллера представления выполните следующие действия:

  1. Установите UIViewControllerBasedStatusBarAppearance в YES в файле .plist, если вам нужно установить стиль строки состояния только на уровне UIViewController. 
  2. В viewDidLoad добавить функцию - setNeedsStatusBarAppearanceUpdate

  3. переопределить предпочитаемыйStatusBarStyle в вашем контроллере представления.

-

override func viewDidLoad() {
    super.viewDidLoad()
    self.setNeedsStatusBarAppearanceUpdate()
}

override var preferredStatusBarStyle: UIStatusBarStyle {
    return .lightContent
}
14
Krunal

Запишите это в свой метод ViewDidLoad:

if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
    self.edgesForExtendedLayout=UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars=NO;
    self.automaticallyAdjustsScrollViewInsets=NO;
}

Это исправило цвет строки состояния для меня и других сбоев пользовательского интерфейса также до некоторой степени.

8
sanjana

Просто добавьте к ответу Шахида - вы можете учитывать изменения ориентации или различные устройства, используя это (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];
  ...
}
6
bendytree

для фона вы можете легко добавить вид, как в примере:

 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.

я надеюсь, что это может помочь вам!

5
user3107409

Вот общее решение для копирования и вставки с

абсолютно правильное объяснение

каждой проблемы.

С благодарностью 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
}
5
Fattie

Изменить цвет фона строки состояния: Swift:

let proxyViewForStatusBar : UIView = UIView(frame: CGRectMake(0, 0,self.view.frame.size.width, 20))    
        proxyViewForStatusBar.backgroundColor=UIColor.whiteColor()
        self.view.addSubview(proxyViewForStatusBar)
4
Yogesh Lolusare

решение iTroid23 сработало для меня. Я пропустил решение Swift. Так что, может быть, это полезно:

1) В мой список мне нужно было добавить это:

<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>

2) Мне не нужно вызывать «setNeedsStatusBarAppearanceUpdate».

3) В Swift мне пришлось добавить это в мой UIViewController:

override func preferredStatusBarStyle() -> UIStatusBarStyle {
    return UIStatusBarStyle.LightContent
}
1
Dirk

В случае 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)
1
Keegan Cruickshank

В 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
   }
})

Здесь я исправил цвет фона строки состояния и цвета панели навигации. Если вы не хотите, чтобы цвет панели навигации был прокомментирован.

0
iOS

Swift 4

В Info.plist добавить это свойство

Показать внешний вид строки состояния контроллера на НЕТ

и после этого в AppDelegate внутри didFinishLaunchingWithOptions добавьте эти строки кода

UIApplication.shared.isStatusBarHidden = false
UIApplication.shared.statusBarStyle = .lightContent
0
S.m.g. baquer

Для цвета панели: вы предоставляете пользовательское фоновое изображение для панели.

Для цвета текста: используйте информацию в Об обработке текста в iOS

0
Chris Alan

Swift 4: -

// Изменить цвет фона строки состояния

    let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView

    statusBar?.backgroundColor = UIColor.red
0
V.Kumar

Мне удалось настроить цвет 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();
}

Итак, вы получите что-то вроде этого:

 enter image description here

Ссылка: https://jorgearamirez.wordpress.com/2016/07/18/lesson-x-effects-for-the-status-bar/

0
Dan

Пожалуйста, попробуйте это . Используйте этот код в вашей функции 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]; }

0
Karthickkck

Если вы используете 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) в расширении, когда вы хотите скрыть панель навигации, в противном случае вид, который использовался в качестве фона, все еще будет виден. 

0
halil_g