2015-10-16 63 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 
    } 

}