2015-10-16 46 views
14

我的應用程序的狀態欄樣式爲UIStatusBarStyleLightContent,它在我的rootViewController中設置爲preferredStatusBarStyleSFSafariViewController狀態欄樣式

現在我有一個問題,當在我的應用程序中打開SFSafariViewController時,它繼承了狀態欄樣式,該樣式在SFSafariViewController的白色背景上很亮且不可見。

有沒有辦法爲SFSafariViewController設置狀態欄風格?

P.S.我試圖繼承SFSafariViewController並重寫此方法,但它沒有幫助。

- (UIStatusBarStyle)preferredStatusBarStyle { 
    return UIStatusBarStyleDefault; 
} 

更新:

[UIApplication的sharedApplication] setStatusBarStyle:]做的伎倆,但這種方法在iOS版9

+0

看來問題出現了,因爲我沒有在info.plist中將基於uiviewcontroller的狀態欄外觀鍵設置爲YES。我重寫狀態欄樣式代碼以使用基於視圖控制器的方式,並且一切都很完美 –

+0

您應該將我的答案標記爲接受的答案。 –

+0

@ClayEllis抱歉,當時錯過了。感謝您的回答 –

回答

12

上面的答案都是太過分了。你根本不需要繼承SFSafariViewController

只需在您的SFSafariViewController的實例上設置modalPresentationCapturesStatusBarAppearance = true,它將自行處理其餘部分。

這是可行的,因爲它自己的默認preferredStatusBarStyle是,你猜對了,.default。視圖層次結構仍然依賴於呈現視圖控制器來顯示狀態欄,因此通過將modalPresentationCapturesStatusBarAppearance設置爲true,接收器會詢問狀態欄外觀。

TL; DR

safariViewController.modalPresentationCapturesStatusBarAppearance = true會做的伎倆。

+1

感謝您使用最優雅的解決方案 –

+4

看起來不適合我... – Alex

1

怎麼樣棄用?

class MyCustomSafariViewController: SFSafariViewController { 

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

或私人API - 如果您可以使用它。

+0

感謝您的建議,但我想要黑暗的狀態欄風格。更新了答案,嘗試了子類,但它不起作用。不能使用私人API –

+0

返回'.Default'不起作用,實際上'preferredStatusBarStyle'永遠不會被調用 –

+7

永遠不要使用私有API。 – Simon

6

這不是最好的解決方案,但它的工作原理。

class MySafariViewContoller: SFSafariViewController { 

    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(true) 

     UIApplication.sharedApplication().statusBarStyle = .Default 
    } 

    override func viewWillDisappear(animated: Bool) { 
     super.viewWillAppear(false) 

     UIApplication.sharedApplication().statusBarStyle = .LightContent 
    } 
} 

根據需要更改.Default和.LightContent。

+0

不錯的解決方案,是將應用程序的iOS版本較低的版本保持爲8.0,並且仍然使用從SFSafariViewController中傳承的類(如果使用的是9.0)? –

+0

我有我的回答 '@available(iOS 9。0,*) class MySafariViewContoller:SFSafariViewController' –

+0

當'UIModalPresentationStyle'屬性設置爲'fullScreen'時,此解決方案可以工作,否則請使用@ clay-ellis接受上面的答案。 – yohannes

4

您可以使用擴展。

extension SFSafariViewController { 

    override open func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(true) 
     UIApplication.shared.statusBarStyle = .default 
    } 

    override open func viewWillDisappear(_ animated: Bool) { 
     super.viewWillDisappear(true) 
     UIApplication.shared.statusBarStyle = .lightContent 
    } 

}