2013-10-01 39 views
91

工作在和Xcode 5內置於iOS 7我在info.plist設置UIViewControllerBasedStatusBarAppearance=YES我的iPhone應用程序,並在我的ViewController我有這樣的代碼:UIStatusBarStyle PreferredStatusBarStyle不會在iOS 7

-(UIStatusBarStyle) preferredStatusBarStyle 
{ 
    return UIStatusBarStyleLightContent; 
} 

但狀態欄仍然是黑色反對黑色背景。

我知道它可以通過在info.plist設置UIViewControllerBasedStatusBarAppearance=NO這個應用程序範圍內的改變,但我確實需要改變這種在運行時viewController通過viewController基礎上。

+0

嗨,我有問題像你提到的相同的問題。你有解決方案嗎?請提供給我。 – Noundla

+0

你可以看看:[更改應用程序狀態欄的文本顏色](http:// stackoverflow。com/a/36324743/5299314) – 1218GG

回答

78

好的,這是訣竅。你必須添加鍵值「查看基於控制器的狀態欄」,並設置值

這是反什麼看來這關鍵的意義,但即使你的值設置爲No,您仍然可以更改狀態欄的外觀,以及它是否顯示在任何視圖控制器中。所以它表現爲「是」,但將其設置爲「否」!

現在我可以得到狀態欄白色或黑暗。

+4

對我來說這是錯誤的。正如您所期望的那樣,必須將密鑰設置爲「是」。我在Xcode 5.1 iOS 7.1上,所以也許它已經改變了。 –

+0

我使用的是Xcode 5.1和iOS 7.1以及NO爲我工作......奇怪。 –

+0

我應該在哪裏添加此密鑰? – Hadu

8

在viewDidLoad中只寫這個

[self setNeedsStatusBarAppearanceUpdate]; 

只是做到這一點,它會工作

可以ü請試試這個

Set UIViewControllerBasedStatusBarAppearance to NO. 
Call [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 

一件事我在你的問題已經看到, 你已經寫下了這樣的方法

-(void)UIStatusBarStyle PreferredStatusBarStyle() 
     { 
      return UIStatusBarStyle.LightContent; 
     } 

,但它應該是這樣的

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
} 
+0

這確實會導致preferredStatusBarStyle方法被調用,但狀態欄仍爲黑色。 –

+0

請參閱我的更新答案..儘快知道我是否有效 –

+0

我的原始問題明確表示,我需要通過視圖控制狀態欄進行查看。 –

0

您可以設置狀態欄樣式。它將類似於iOS 6及以下版本的狀態欄。
粘貼在您的視圖控制器

-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleBlackOpaque; 
} 

這種方法並從視圖中調用這個方法做負載這樣

if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) 
    { 
     [self setNeedsStatusBarAppearanceUpdate]; 
    } 
+0

蘋果文檔說UIStatusBarStyleBlackOpaque已棄用 –

+1

試過,它沒有奏效。 –

+0

你的意思是第二塊中的[self setStatusBarNeedsUpdate]? (或至少是其他的東西)。 – mxcl

247

我發現,如果你的ViewController是一個navigationController內,則navigationController的navigationBar.barStyle決定statusBarStyle 。

設置您的導航欄的barStyleUIBarStyleBlackTranslucent會給白色狀態欄文本(即UIStatusBarStyleLightContent)和UIBarStyleDefault會給黑狀態欄文本(即UIStatusBarStyleDefault)。

注意即使您通過其barTintColor完全更改導航欄的顏色,也適用。

+17

這對我來說毫無意義,但它起作用!謝謝。 – avance

+0

這對我有意義...很好 – Nick

+12

我相信這是因爲'UINavigationController'的'preferredStatusBarStyle'不會調用它所託管的ViewController,而只是基於其navigationBarStyle返回。 – mxcl

20

爲了提供更多的細節到接受的答案,把下面的行應用程序委託的didFinishLaunchingWithOptions:方法:

[UIApplication sharedApplication].statusBarStyle = UIStatusBarStyleLightContent; 

然後,在你Info.plist中,添加View controller-based status bar appearance並將其設置爲NO

我相信這是應該如何完成的,而不是從導航控制器,如果你想爲整個應用程序使用相同的狀態欄顏色。您可能有不一定嵌入UINavigationController中的屏幕,或其他地方的其他UINavigationController子類以及其他內容。

編輯:您也可以做到這一點,而無需輸入任何代碼:https://stackoverflow.com/a/18732865/855680

1

如果萬一你想隱藏啓動畫面中狀態欄,但希望將改變風格輕內容(StatusBarInitiallyHidden上的plist必須是NO以隱藏狀態欄),您可以將其添加到appDelegate的didFinishLaunchingWithOptions方法以更改爲lightContent。

[[UIApplication sharedApplication]setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide]; 
[[UIApplication sharedApplication]setStatusBarStyle:UIStatusBarStyleLightContent]; 
1

迅速例如

在AppDelegate.swift

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool { 
    UIApplication.sharedApplication().statusBarStyle = UIStatusBarStyle.LightContent; 

    return true 
} 
在info.plist中集查看基於控制器的狀態欄外觀

:NO

1

如果您使用NavigationController,你可以子類NavigationController,以便它諮詢其子視圖控制器

// MyCustomNavigationController

- (NSUInteger)supportedInterfaceOrientations { 
    UIViewController *viewControllerToAsk = [self findChildVC]; 
    return [viewControllerToAsk supportedInterfaceOrientations]; 
} 

- (BOOL)shouldAutorotate { 
    UIViewController *viewControllerToAsk = [self findChildVC]; 
    return [viewControllerToAsk shouldAutorotate]; 
} 

- (UIStatusBarStyle)preferredStatusBarStyle { 
    UIViewController *viewControllerToAsk = [self findChildVC]; 
    return [viewControllerToAsk preferredStatusBarStyle]; 
} 

- (UIViewController *)findChildVC { 
    return self.viewControllers.firstObject; 
} 
30

我可以來到這個有點晚,但櫃面其他人正在尋找工作和經過驗證的應用級解決方案。

@mxcl在描述發生這種情況時是正確的。爲了糾正它,我們只需創建一個覆蓋UINavigationController的preferredSatusBarStyle()方法的擴展(或obj-c中的類別)。這裏是在夫特一個例子:

extension UINavigationController { 
    public override func preferredStatusBarStyle() -> UIStatusBarStyle { 
     if let rootViewController = self.viewControllers.first { 
      return rootViewController.preferredStatusBarStyle() 
     } 
     return super.preferredStatusBarStyle() 
    } 
} 

此代碼簡單地提取第一視圖控制器(根視圖控制器)和解開它(在OBJ-C只是檢查它不是nil)。如果解包成功(而不是零),那麼我們抓取rootViewControllers preferredStatusBarStyle。否則,我們只是返回默認值。

希望這可以幫助任何可能需要它的人。

+2

在Swift 2.0中你必須刪除條件語句的「as?UIViewController」。 –

+0

輝煌的是,除了刪除「as」語句之外,我做了一個修改,我用這種方式將它從「first」更改爲「last」,無論用戶在堆棧頂部看到的任何視圖控制器都能夠控制狀態欄的顏色。非常棒的工作,感謝分享! – Unome

+1

如果您的導航控制器沒有任何視圖控制器,則會導致無限循環。 'return self.preferredStatusBarStyle()'會回調到這個完全相同的方法。 – bearMountain

2

1)整個項目的一個設定:

如果可用,從您的info.plist刪除UIViewControllerBasedStatusBarAppearance鍵值對,或者設置NO而不移除它。如果它不在你的info.plist中,請不要執行任何操作。此屬性的默認值爲NO

將以下代碼添加到您的AppDelegate。L:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent]; 
} 

2)針對不同的視圖控制器不同的設置:

添加UIViewControllerBasedStatusBarAppearance鍵值對您的info.plist並將其設置爲YES

如果您的View Controller沒有嵌入導航控制器。我們說MyViewController。只需將下面的代碼添加到您的MyViewController.m文件。如果您的View Controller嵌入到導航控制器中,請創建一個新的Cocoa Touch類並將其作爲UINavigationController的子類。讓我們說MyNC。在右側窗格中選擇您的故事板上的導航控制器視圖;實用程序 - >身份檢查器 - >自定義類 - >類,鍵入「MyNC」。連接你的「MyNC」可可觸摸類故事板視圖後,下面的代碼添加到您MyNC.m:

- (BOOL)prefersStatusBarHidden { 
    return NO; 
} 

-(UIStatusBarStyle)preferredStatusBarStyle { 
    return UIStatusBarStyleLightContent; 
} 
+0

似乎iOS9 UIViewControllerBasedStatusBarAppearance默認情況下包含值YES,因爲我需要在.plist中手動添加它並將其設置爲NO才能正常工作。 –

27

對於preferredStatusBarStyle()範圍內開展工作UINavigationControllerUITabBarController我添加以下代碼,將得到優先狀態欄風格從當前可見的視圖控制器。

extension UITabBarController { 
    public override func childViewControllerForStatusBarStyle() -> UIViewController? { 
     return selectedViewController 
    } 
} 

extension UINavigationController { 
    public override func childViewControllerForStatusBarStyle() -> UIViewController? { 
     return visibleViewController 
    } 
} 

對於斯威夫特3那些不是方法,而是屬性:

extension UITabBarController { 
    open override var childViewControllerForStatusBarStyle: UIViewController? { 
     return selectedViewController 
    } 
} 

extension UINavigationController { 
    open override var childViewControllerForStatusBarStyle: UIViewController? { 
     return visibleViewController 
    } 
} 
+4

這是迄今爲止最好的答案(對於使用UINavigationController或UITabBarController – Kesava

+0

的應用程序,這個用法是什麼? – Annjawn

+0

@Annjawn UIKit使用這些方法,除了將其添加到項目之外,您無需執行任何操作。 –

5

這是我如何解決它。通常navigationController或tabBarController是決定狀態欄外觀(隱藏,顏色等)的選項。

所以我結束了subclassing導航控制器和覆蓋preferredStatusBarStyle。如果當前可見的ViewContorller實現了StatusBarStyleHandler,我要求將該值用作樣式,如果不是,則只返回默認值。

你觸發狀態欄外觀的更新的方法是根據什麼方法將返回

public protocol StatusBarStyleHandler { 
    var preferredStatusBarStyle: UIStatusBarStyle { get } 
} 

public class CustomNavigationCotnroller: UINavigationController { 

    public override var preferredStatusBarStyle: UIStatusBarStyle { 
     if let statusBarHandler = visibleViewController as? StatusBarStyleHandler { 
      return statusBarHandler.preferredStatusBarStyle 
     } 

     return .default 
    } 
} 

然後使用

public class SomeController: UIViewController, StatusBarStyleHandler { 

    private var statusBarToggle = true 

    // just a sample for toggling the status bar style each time method is called 
    private func toggleStatusBarColor() { 
     statusBarToggle = !statusBarToggle 
     setNeedsStatusBarAppearanceUpdate() 
    } 

    public override var preferredStatusBarStyle: UIStatusBarStyle { 
     return statusBarToggle ? .lightContent : .default 
    } 
} 
+0

如果你能解釋爲什麼以及如何解決這個問題,這篇文章會有很大的改進。 –

+0

除了創建UINavigationController的子類,您還可以爲UINavigationController創建一個擴展,並獲得相同的結果,而不必繼承子類。 – wilforeal

0

對於迅速調用setNeedsStatusBarAppearanceUpdate這再次觸發preferredStatusBarStyle和更新UI 3,在你的UIViewController中:

override var preferredStatusBarStyle : UIStatusBarStyle { return UIStatusBarStyle.lightContent } 
2

即使在這裏所有的答案,我仍然沒有找到確切的解決方案,但從丹尼爾的答案開始。我最後得到的是:

override var preferredStatusBarStyle: UIStatusBarStyle { 
    return visibleViewController?.preferredStatusBarStyle ?? .lightContent 
} 

在導航控制器(類似的選項卡,只是selectedViewController)。然後它會尊重:

override var preferredStatusBarStyle: UIStatusBarStyle { 
    return .lightContent 
} 

在每個視圖控制器中,除非您另行設置。我不需要在任何地方撥打setNeedsStatusBarAppearanceUpdate(),它只是在您到達每個視圖控制器時更新。

+1

經過幾個小時的努力,我終於找到了幾乎完全相同的解決方案。 –

相關問題