【问题标题】:status bar disappeared after full screen video in WKWebView only in iOS 12仅在 iOS 12 中 WKWebView 中的全屏视频后状态栏消失
【发布时间】:2018-09-02 11:20:40
【问题描述】:

如您所见,这只发生在 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()
    }
}

我的 info.plist 就在下面:

有人知道怎么解决吗?

我知道,如果我将密钥 View controller-based status bar appearance 设置为 YES 会有所帮助,但在这种情况下,它将如下所示:

状态栏由白变黑的原因不明,而且我的实际项目规模很大,所以最好在原始设置中解决,而不是让每个ViewController都继承一个类是 UIViewController 的子类或添加 dynamic 以在扩展中覆盖 prefersStatusBarHiddenpreferredStatusBarStyle(这里只是尝试在 View controller-based status bar appearance 设置为 YES 时强制它显示更新状态栏)

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

here是demo项目,由Xcode9.4创建,欢迎试用。

【问题讨论】:

  • 从全屏返回时,视频播放器也会发生这种情况。也开始于 iOS 12。
  • 全屏后对我来说同样的问题。有什么修复吗?
  • 你有解决办法吗?
  • 我也对解决方案感兴趣。
  • 我在 iOS 12 上收到错误,但在 iOS 13 上没有。在 info.plist 中没有任何关于状态栏的条目

标签: xcode xcode10 xcode10beta6


【解决方案1】:

info.plist 文件中删除关注属性。并仅以编程方式提供。

状态栏最初是隐藏的:否

查看基于控制器的状态栏外观:否

状态栏样式:UIStatusBarStyleLightContent

它可能对你有用。

【讨论】:

    【解决方案2】:

    使用这个解决方案:

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

    【讨论】:

    • setStatusBarHidden: animated: 已被弃用。你应该使用Use -[UIViewController prefersStatusBarHidden]
    【解决方案3】:

    最后我使用了objective-c中的category来处理这个问题。 我将View controller-based status bar appearance 设置为 YES 并在下面添加代码

    - (UIStatusBarStyle)preferredStatusBarStyle
    {
        return UIStatusBarStyleLightContent;
    }
    
    - (BOOL)prefersStatusBarHidden
    {
        return NO;
    } 
    

    根据我的经验,你还必须在 UINavigationViewController 中实现上面的代码。 似乎它有自己的实现。 并且每个窗口看是否存在rootViewController,如果没有,则为它添加一个。

    虽然这个解决方案有点麻烦,但这是我迄今为止完美解决问题的一个。

    【讨论】:

      【解决方案4】:

      创建一个AVPlayerViewController 的扩展名,如下所示

      extension AVPlayerViewController {
          open override var prefersStatusBarHidden: Bool {
              return false
          }
      }
      

      【讨论】:

        【解决方案5】:

        如果您希望状态栏为白色,技术上为.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,可能需要在viewWillAppear()内部触发self.setNeedsStatusBarAppearanceUpdate()的调用,通知状态栏自行刷新。 p>

        希望有帮助!!!祝你好运!

        【讨论】:

          【解决方案6】:

          订阅

          UIWindowDidBecomeHiddenNotification

          事件

          NSNotificationCenter.DefaultCenter.AddObserver(new NSString("UIWindowDidBecomeHiddenNotification"), HandleAction);
          

          并在处理程序中设置状态栏状态:

          void HandleAction(NSNotification obj)
          {
              UIApplication.SharedApplication.StatusBarHidden = false;
          }
          

          【讨论】:

          • 您好,欢迎使用 stackoverflow,请记住在复制粘贴代码之前考虑将用户指向文档并推理您的答案。感谢您的贡献。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-03-03
          • 1970-01-01
          • 1970-01-01
          • 2015-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多