仅在iOS 12中在WKWebView中播放全屏视频后,状态栏消失了

时间:2018-09-02 11:20:40

标签: xcode xcode10 xcode10beta6

您可以看到这仅发生在iOS 12中。

iOS 12 iOS 11

enter image description here enter image description here

这是我的代码:

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()
    }
}

我的info.plist就在下面: enter image description here

有人知道如何解决吗?

我知道如果将键View controller-based status bar appearance设置为YES会有所帮助,但是在这种情况下,它看起来像这样:

enter image description here

将状态栏从白色和黑色更改为未知原因,因为我的真实项目规模很大,因此最好在原始设置中解决,而不是让每个ViewController都继承一个类,是UIViewController的子类,或者添加dynamic以覆盖扩展中的prefersStatusBarHiddenpreferredStatusBarStyle(在View controller-based status bar appearance设置为YES时,请尝试强制它显示更新状态栏)

希望有一个将View controller-based status bar appearance设置为NO的解决方案,这将非常有用。

here 是演示项目,它是由Xcode9.4创建的,请随时尝试。

6 个答案:

答案 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,请按照以下步骤操作:

  1. Info.plist中,设置View controller-based status bar appearance = YES
  2. 创建对UIViewControllerUINavigationController的扩展,并编写以下代码:
    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;
}