您可以看到这仅发生在iOS 12中。
iOS 12 iOS 11
这是我的代码:
import UIKit
import WebKit
class ViewController: UIViewController {
override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
override var prefersStatusBarHidden: Bool {
return false
}
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
webView = WKWebView(frame: UIScreen.main.bounds)
view.addSubview(webView)
webView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
webView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
webView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
webView.loadHTMLString("<p><iframe src=\"https://www.youtube.com/embed/HCjNJDNzw8Y\" width=\"560\" height=\"315\" frameborder=\"0\" allowfullscreen=\"\"></iframe></p>", baseURL: URL(string: "https://www.youtube.com/"))
setNeedsStatusBarAppearanceUpdate()
}
}
有人知道如何解决吗?
我知道如果将键View controller-based status bar appearance
设置为YES
会有所帮助,但是在这种情况下,它看起来像这样:
将状态栏从白色和黑色更改为未知原因,因为我的真实项目规模很大,因此最好在原始设置中解决,而不是让每个ViewController都继承一个类,是UIViewController的子类,或者添加dynamic
以覆盖扩展中的prefersStatusBarHidden
和preferredStatusBarStyle
(在View controller-based status bar appearance
设置为YES
时,请尝试强制它显示更新状态栏)
希望有一个将View controller-based status bar appearance
设置为NO
的解决方案,这将非常有用。
here 是演示项目,它是由Xcode9.4创建的,请随时尝试。
答案 0 :(得分:7)
从info.plist
文件中删除“跟随”属性。并仅以编程方式提供。
状态栏最初是隐藏的:否
基于视图控制器的状态栏外观:否
状态栏样式:UIStatusBarStyleLightContent
可能对您有用。
答案 1 :(得分:1)
使用此解决方案:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
...
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(videoExitFullScreen:) name:@"UIWindowDidBecomeHiddenNotification" object:nil];
...
}
- (void)videoExitFullScreen:(id)sender
{
[[UIApplication sharedApplication] setStatusBarHidden:NO animated:YES];
}
更多参考:
https://github.com/react-native-community/react-native-webview/issues/62
答案 2 :(得分:0)
最后,我在Objective-c中使用了类别来解决此问题。
我将View controller-based status bar appearance
设置为YES,并在下面添加代码
- (UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
- (BOOL)prefersStatusBarHidden
{
return NO;
}
根据我的经验,您还必须在UINavigationViewController中实现以上代码。 看来它对此有自己的实现。 还有每个窗口,查看是否存在rootViewController,如果不存在,则为其添加一个。
尽管此解决方案有点麻烦,但这是我到目前为止完美解决了这个问题的解决方案。
答案 3 :(得分:0)
创建一个AVPlayerViewController
的扩展名,如下图所示
extension AVPlayerViewController {
open override var prefersStatusBarHidden: Bool {
return false
}
}
答案 4 :(得分:0)
如果您希望状态栏为白色,技术上为.lightContent
,请按照以下步骤操作:
Info.plist
中,设置View controller-based status bar appearance = YES
UIViewController
或UINavigationController
的扩展,并编写以下代码: open override var preferredStatusBarStyle: UIStatusBarStyle {
return .lightContent
}
open override var prefersStatusBarHidden: Bool {
return false
}
注意:如果状态栏返回到dark
,则可能需要触发self.setNeedsStatusBarAppearanceUpdate()
内部的viewWillAppear()
调用以通知状态栏刷新自己。
希望有帮助!!!祝你愉快!
答案 5 :(得分:-1)
订阅
UIWindowDidBecomeHiddenNotification
事件
NSNotificationCenter.DefaultCenter.AddObserver(new NSString("UIWindowDidBecomeHiddenNotification"), HandleAction);
并在处理程序中设置状态栏状态:
void HandleAction(NSNotification obj)
{
UIApplication.SharedApplication.StatusBarHidden = false;
}