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

<p>мое текущее приложение работает на ios 5 и 6. </p><p>панель навигации имеет оранжевый цвет, а строка состояния - черный фон с белым цветом текста. однако, когда я запускаю то же самое приложение на ios 7, я вижу, что строка состояния выглядит прозрачной с тем же оранжевым цветом фона, что и панель навигации, а цвет строки состояния - черный. </p><p>из-за этого я не могу различить строку состояния и панель навигации. </p><p>как сделать так, чтобы строка состояния выглядела так же, как это было в ios 5 и 6, то есть с черным цветом фона и белым цветом текста? как я могу сделать это программно?</p>

<p>пришлось искать другие пути. который не включает <code>addsubview</code> в окне. потому что я двигаюсь вверх по окну, когда представлена клавиатура.</p><h3>цель с</h3><pre><code>- (void)setstatusbarbackgroundcolor:(uicolor *)color { uiview *statusbar = [[[uiapplication sharedapplication] valueforkey:@"statusbarwindow"] valueforkey:@"statusbar"]; if ([statusbar respondstoselector:@selector(setbackgroundcolor:)]) { statusbar.backgroundcolor = color; } } </code></pre><h3>стриж</h3><pre><code>func setstatusbarbackgroundcolor(color: uicolor) { guard let statusbar = uiapplication.sharedapplication().valueforkey("statusbarwindow")?.valueforkey("statusbar") as? uiview else { return } statusbar.backgroundcolor = color } </code></pre><h3>свифт 3</h3><pre><code>func setstatusbarbackgroundcolor(color: uicolor) { guard let statusbar = uiapplication.shared.value(forkeypath: "statusbarwindow.statusbar") as? uiview else { return } statusbar.backgroundcolor = color } </code></pre><p>вызов этой формы <code>application:didfinishlaunchingwithoptions</code> сработал для меня.</p><p>нотабене у нас есть приложение в магазине приложений с этой логикой. так что я думаю, что это нормально с политикой магазина приложений. </p><hr><p><strong> правка: </strong></p><p>используйте на свой риск. форма комментатора @sebyddd</p><blockquote> <p>у меня было одно приложение отклонено по этой причине, в то время как другое было принято просто хорошо. они считают это частным использованием api, поэтому вы подвержены удачи в процессе рецензирования :) - sebyddd</p> </blockquote>

<p>перейти к вашему приложению <code>info.plist</code> <br><br> 1) установите для <code>view controller-based status bar appearance</code> значение <code>no</code><br> 2) установите для <code>status bar style</code> значение <code>uistatusbarstylelightcontent</code> <br><br> затем перейдите к делегату приложения и вставьте следующий код, где вы устанавливаете rootviewcontroller для windows.<br></p><pre><code>#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]; } </code></pre><p>надеюсь, поможет.</p>

<p>1) установите для uiviewcontrollerbasedstatusbarappearance значение yes в списке</p><p>2) в viewdidload сделать <code>[self setneedsstatusbarappearanceupdate];</code></p><p>3) добавить следующий метод:</p><pre><code> -(uistatusbarstyle)preferredstatusbarstyle{ return uistatusbarstylelightcontent; } </code></pre><p>обновление:<br> также проверьте <a href="http://www.doubleencore.com/2013/09/developers-guide-to-the-ios-7-status-bar/">руководство разработчика по строке состояния ios-7</a> </p>

<p>при обработке цвета фона строки состояния в ios 7, есть 2 случая</p><p>случай 1: просмотр с панелью навигации</p><p>в этом случае используйте следующий код в вашем методе viewdidload</p><pre><code> 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]; </code></pre><p>случай 2: просмотр без панели навигации</p><p>в этом случае используйте следующий код в вашем методе viewdidload</p><pre><code> 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]; </code></pre><p>ссылка на источник <a href="http://code-ios.blogspot.in/2014/08/how-to-change-background-color-of.html">http://code-ios.blogspot.in/2014/08/how-to-change-background-color-of.html</a> </p>

<p>в ios 7 строка состояния не имеет фона, поэтому, если вы поместите за ней черное представление высотой 20px, вы получите тот же результат, что и в ios 6.</p><p>также вы можете прочитать <a href="https://developer.apple.com/library/ios/documentation/userexperience/conceptual/transitionguide/bars.html#//apple\_ref/doc/uid/tp40013174-ch8-sw1">руководство по переходу с ios 7</a> для получения дополнительной информации по этому вопросу.</p>

<p>вы можете установить цвет фона для строки состояния во время запуска приложения или во время viewdidload вашего контроллера представления.</p><pre><code>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 } } </code></pre><p><br><br> вот результат:</p><p><img src="https://i.stack.imgur.com/lkppl.png" alt="enter image description here"></p><p><br> вот <a href="https://developer.apple.com/ios/human-interface-guidelines/ui-bars/status-bars/">apple guidelines/instruction</a> об изменении строки состояния. только темные и светлые (в то время как и черные) разрешены в строке состояния.</p><p><em>вот - как изменить стиль строки состояния:</em></p><p>если вы хотите установить стиль строки состояния, уровень приложения, то установите <code>uiviewcontrollerbasedstatusbarappearance</code> в <code>no</code> в вашем файле `.plist '.</p><p>если вы хотите установить стиль строки состояния, на уровне контроллера представления выполните следующие действия:</p><ol> <li>установите <code>uiviewcontrollerbasedstatusbarappearance</code> в <code>yes</code> в файле <code>.plist</code>, если вам нужно установить стиль строки состояния только на уровне uiviewcontroller. </li> <li><p>в viewdidload добавить функцию - <code>setneedsstatusbarappearanceupdate</code></p></li> <li><p>переопределить предпочитаемыйstatusbarstyle в вашем контроллере представления.</p></li> </ol><p>-</p><pre><code>override func viewdidload() { super.viewdidload() self.setneedsstatusbarappearanceupdate() } override var preferredstatusbarstyle: uistatusbarstyle { return .lightcontent } </code></pre>

<p>запишите это в свой метод viewdidload:</p><pre><code>if ([self respondstoselector:@selector(setedgesforextendedlayout:)]) { self.edgesforextendedlayout=uirectedgenone; self.extendedlayoutincludesopaquebars=no; self.automaticallyadjustsscrollviewinsets=no; } </code></pre><p>это исправило цвет строки состояния для меня и других сбоев пользовательского интерфейса также до некоторой степени.</p>

<p>просто добавьте к ответу шахида - вы можете учитывать изменения ориентации или различные устройства, используя это (ios7 +):</p><pre><code>- (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]; ... } </code></pre>

<p>для фона вы можете легко добавить вид, как в примере:</p><pre><code> 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]; </code></pre><p>где "navbar" - это uinavigationbar.</p><p>я надеюсь, что это может помочь вам!</p>

<p>вот общее решение для копирования и вставки с</p><h1>абсолютно правильное объяснение</h1><p>каждой проблемы.</p><h1>с благодарностью <a href="https://stackoverflow.com/users/1378447/warif-akhand-rishi">warif akhand rishi</a> !</h1><p>для удивительной находки относительно keypath <code>statusbarwindow.statusbar</code>. неплохо.</p><pre><code>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 } </code></pre>

<p>изменить цвет фона строки состояния: swift:</p><pre><code>let proxyviewforstatusbar : uiview = uiview(frame: cgrectmake(0, 0,self.view.frame.size.width, 20)) proxyviewforstatusbar.backgroundcolor=uicolor.whitecolor() self.view.addsubview(proxyviewforstatusbar) </code></pre>

<p>решение itroid23 сработало для меня. я пропустил решение swift. так что, может быть, это полезно:</p><p>1) в мой список мне нужно было добавить это:</p><pre><code><key>uiviewcontrollerbasedstatusbarappearance</key> <true/> </code></pre><p>2) мне не нужно вызывать «setneedsstatusbarappearanceupdate».</p><p>3) в swift мне пришлось добавить это в мой uiviewcontroller:</p><pre><code>override func preferredstatusbarstyle() -> uistatusbarstyle { return uistatusbarstyle.lightcontent } </code></pre>

<p>в случае swift 2.0 на ios 9 </p><p>поместите следующее в делегат приложения под didfinishlaunchingwithoptions:</p><pre><code> 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) </code></pre>

<p>в swift 5 и xcode 10.2</p><pre><code>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 } }) </code></pre><p>здесь я исправил цвет фона строки состояния и цвета панели навигации. если вы не хотите, чтобы цвет панели навигации был прокомментирован.</p>

<p><strong> swift 4 </strong></p><p>в <code>info.plist</code> добавить это свойство</p><p><strong> показать внешний вид строки состояния контроллера на нет </strong></p><p>и после этого в <code>appdelegate</code> внутри <code>didfinishlaunchingwithoptions</code> добавьте эти строки кода</p><pre><code>uiapplication.shared.isstatusbarhidden = false uiapplication.shared.statusbarstyle = .lightcontent </code></pre>

<p>для цвета панели: вы предоставляете пользовательское фоновое изображение для панели.</p><p>для цвета текста: используйте информацию в <em> <a href="https://developer.apple.com/library/ios/documentation/stringstextfonts/conceptual/textandwebiphoneos/introduction/introduction.html">об обработке текста в ios</a> </em></p>

<p><strong> swift 4: - </strong></p><p>// изменить цвет фона строки состояния</p><pre><code> let statusbar = uiapplication.shared.value(forkeypath: "statusbarwindow.statusbar") as? uiview statusbar?.backgroundcolor = uicolor.red </code></pre>

<p>мне удалось настроить цвет statusbar довольно просто, добавив в файл <code>appdelegate.cs</code> метод:</p><p><code>public override bool finishedlaunching(uiapplication app, nsdictionary options)</code> </p><p>следующий код:</p><pre><code>uiview statusbar = uiapplication.sharedapplication.valueforkey(new nsstring("statusbar")) as uiview; if (statusbar!=null && statusbar.respondstoselector(new selector("setbackgroundcolor:"))) { statusbar.backgroundcolor = color.fromhex(redcolorhex).touicolor(); } </code></pre><p>итак, вы получите что-то вроде этого:</p><p> <a href="https://i.stack.imgur.com/aatoi.png"> <img src="https://i.stack.imgur.com/aatoi.png" alt="enter image description here"> </a> </p><p>ссылка: <a href="https://jorgearamirez.wordpress.com/2016/07/18/lesson-x-effects-for-the-status-bar/">https://jorgearamirez.wordpress.com/2016/07/18/lesson-x-effects-for-the-status-bar/</a> </p>

<p>пожалуйста, попробуйте это . используйте этот код в вашей функции appdelegate класса «didfinishlaunchingwithoptions»</p><p><code>[[uiapplication sharedapplication] setstatusbarstyle:uistatusbarstylelightcontent]; [application setstatusbarhidden:no]; uiview *statusbar = [[[uiapplication sharedapplication] valueforkey:@"statusbarwindow"] valueforkey:@"statusbar"]; if ([statusbar respondstoselector:@selector(setbackgroundcolor:)]) { statusbar.backgroundcolor = [uicolor blackcolor]; }</code></p>

<p>если вы используете <code>uinavigationcontroller</code>, вы можете использовать такое расширение:</p><pre><code>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) } } </code></pre><p>это в основном делает фон панели навигации прозрачным и использует другой uiview в качестве фона. вы можете вызвать метод <code>setnavigationbarbackground</code> вашего контроллера навигации, чтобы установить цвет фона панели навигации вместе со строкой состояния. </p><p>имейте в виду, что вы должны затем использовать метод <code>setnavigationbar(hidden: bool, animated: bool)</code> в расширении, когда вы хотите скрыть панель навигации, в противном случае вид, который использовался в качестве фона, все еще будет виден. </p>