Как изменить цвет фона в строке состояния и цвет текста на iOS 7?
Текущее приложение работает на iOS 5 и 6.
Навигационная панель имеет оранжевый цвет, а строка состояния имеет черный цвет фона с белым цветом текста. Однако, когда я запускаю одно и то же приложение на iOS 7, я вижу, что строка состояния выглядит прозрачной с тем же оранжевым цветом фона, что и панель навигации, а цвет текста в строке состояния - черный.
В связи с этим я не могу различать строку состояния и панель навигации.
Как заставить строку состояния выглядеть так же, как в iOS 5 и 6, то есть с черным фоном и белым цветом текста? Как я могу сделать это программно?
Ответы
Ответ 1
Пришлось искать другие пути. Который не включает addSubview
в окне. Потому что я двигаюсь вверх по окну, когда представлена клавиатура.
Objective-C
- (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
работал для меня.
NB У нас есть приложение в магазине приложений с этой логикой. Так что я думаю, что это нормально с политикой магазина приложений.
Редактировать:
Используйте на свой риск. Форма комментатор @Sebyddd
У меня было одно приложение отклонено по этой причине, в то время как другое было принято просто отлично. Они считают это частным использованием API, поэтому вам может повезти в процессе рецензирования :) - Sebyddd
Ответ 2
Откройте приложение 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];
}
Надеюсь, что это поможет.
Ответ 3
1) установите для UIViewControllerBasedStatusBarAppearance значение YES в plist
2) in viewDidLoad сделать a [self setNeedsStatusBarAppearanceUpdate];
3) добавьте следующий метод:
-(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}
UPDATE:
также проверьте developers-guide-to-the-ios-7-status-bar
Ответ 4
При обработке цвета фона в строке состояния в 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
Ответ 5
Вы можете установить цвет фона для строки состояния во время запуска приложения или во время 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/Инструкция по изменению строки состояния. Только темные и светлые (в то время как и черные) разрешены в строке состояния.
Вот как изменить стиль строки состояния:
Если вы хотите установить стиль строки состояния, уровень приложения, то установите для UIViewControllerBasedStatusBarAppearance
значение NO
в вашем файле .plist.
если вы хотите установить стиль строки состояния, на уровне контроллера представления выполните следующие действия:
- Установите для
UIViewControllerBasedStatusBarAppearance
значение YES
в файле .plist
, если вам нужно установить стиль строки состояния только на уровне UIViewController. -
В viewDidLoad добавить функцию - setNeedsStatusBarAppearanceUpdate
-
переопределите предпочитаемый элемент StatusBarStyle в вашем контроллере представления.
-
override func viewDidLoad() {
super.viewDidLoad()
self.setNeedsStatusBarAppearanceUpdate()
}
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
Ответ 6
В iOS 7 в строке состояния нет фона, поэтому, если вы поместите черный 20px-высокий вид за ним, вы достигнете того же результата, что и iOS 6.
Также вы можете прочитать Руководство по переходу на iOS 7 UI для получения дополнительной информации по этому вопросу.
Ответ 7
Запишите это в свой метод ViewDidLoad:
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
self.edgesForExtendedLayout=UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars=NO;
self.automaticallyAdjustsScrollViewInsets=NO;
}
Он фиксировал цвет строки состояния для меня и других замеров пользовательского интерфейса также в некоторой степени.
Ответ 8
для фона вы можете легко добавить вид, как в примере:
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.
Ответ 9
Просто добавьте ответ Shahid - вы можете учитывать изменения ориентации или разные устройства, используя это (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];
...
}
Ответ 10
Здесь общее, скопируйте и вставьте решение, с
абсолютно правильное объяснение
каждой проблемы.
для удивительной находки относительно 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 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
}
Ответ 11
Изменить цвет фона строки состояния:
Swift:
let proxyViewForStatusBar : UIView = UIView(frame: CGRectMake(0, 0,self.view.frame.size.width, 20))
proxyViewForStatusBar.backgroundColor=UIColor.whiteColor()
self.view.addSubview(proxyViewForStatusBar)
Ответ 12
Свифт 4:
//Изменить цвет фона строки состояния
let statusBar = UIApplication.shared.value(forKeyPath: "statusBarWindow.statusBar") as? UIView
statusBar?.backgroundColor = UIColor.red
Ответ 13
В случае быстрого 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)
Ответ 14
iTroid23 работал у меня. Я пропустил решение Swift. Поэтому, возможно, это полезно:
1) В моем plist я должен был добавить это:
<key>UIViewControllerBasedStatusBarAppearance</key>
<true/>
2) Мне не нужно было вызывать "setNeedsStatusBarAppearanceUpdate".
3) В swift мне пришлось добавить это в мой UIViewController:
override func preferredStatusBarStyle() -> UIStatusBarStyle {
return UIStatusBarStyle.LightContent
}
Ответ 15
Мне удалось настроить цвет 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/
Ответ 16
Для цвета штриха: вы предоставляете пользовательское фоновое изображение для панели.
Цвет текста: используйте информацию в О обработке текста в iOS
Ответ 17
Если вы используете 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)
в расширении, если вы хотите скрыть панель навигации, иначе вид, который использовался в качестве фона, будет по-прежнему отображаться.
Ответ 18
Попробуй это. Используйте этот код в своем классе didFinishLaunchingWithOptions
функции 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];
}
Ответ 19
Swift 4
В Info.plist
добавить эту недвижимость
Просмотреть внешний вид строки состояния на основе контроллера, чтобы НЕТ
и после этого в AppDelegate
внутри didFinishLaunchingWithOptions
добавьте эти строки кода
UIApplication.shared.isStatusBarHidden = false
UIApplication.shared.statusBarStyle = .lightContent
Ответ 20
В 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
}
})
Здесь я исправил цвет фона строки состояния и цвета панели навигации. Если вы не хотите, чтобы цвет панели навигации был прокомментирован.