web-dev-qa-db-ja.com

iOS 12でのみWKWebViewの全画面ビデオの後にステータスバーが消えた

ご覧のとおり、これはiOS 12でのみ発生しました。

iOS 12 iOS 11

enter image description hereenter 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 appearanceYESに設定すると役立つことがわかりますが、その場合は次のようになります。

enter image description here

ステータスバーを白と黒から変更する理由は不明ですが、私の実際のプロジェクトは大規模であるため、すべてのViewControllerがサブクラスである1つのクラスから継承するのではなく、元の設定で解決すると便利ですUIViewControllerまたはdynamicを追加して、prefersStatusBarHiddenpreferredStatusBarStyleを拡張機能でオーバーライドします(ここで、View controller-based status bar appearanceYESに設定されている場合に、更新ステータスバーを強制的に表示しようとします)。

View controller-based status bar appearanceNOに設定して、非常に役立つ解決策があることを願っています。

ここは、Xcode9.4で作成されたデモプロジェクトです。自由に試してみてください。

12
andrew54068

info.plistファイルから以下のプロパティを削除します。プログラムでのみ与える。

ステータスバーは最初は非表示です:いいえ

コントローラベースのステータスバーの外観を表示する:いいえ

ステータスバーのスタイル:UIStatusBarStyleLightContent

それはあなたのための仕事かもしれません。

8

このソリューションを使用してください:

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

最終的に私はこの問題に対処するために、objective-cのカテゴリを使用しました。 View controller-based status bar appearanceをYESにして、以下のコードを追加します

- (UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

- (BOOL)prefersStatusBarHidden
{
    return NO;
} 

私の経験としては、上記のコードをUINavigationViewControllerにも実装する必要があります。そのための独自の実装があるようです。また、すべてのウィンドウでrootViewControllerが存在するかどうかを確認し、存在しない場合は追加します。

この解決策は少し面倒ですが、それは私がこれまで私の問題を完全に解決したものです。

0
andrew54068

購読する

UIWindowDidBecomeHiddenNotification

出来事

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

ステータスバーの状態をハンドラーに設定します。

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