web-dev-qa-db-ja.com

iOS 13でuinavigationbarとビューの間のギャップを防ぐ方法は?

現在、iOS 13でモーダルプレゼンテーションを使用すると、ナビゲーションバーのサイジングに問題があります。

このスクリーンショットでわかるように、ほとんどの場合、これは正常に機能します。

ただし、いくつかの画面では、この奇妙な効果が得られます。ナビゲーションバーの高さが低く、ビューとの間に「シースルー」の奇妙なギャップがあります。このスクリーンショットに見られるように:

両方のビューコントローラーのプロパティに同じ値が設定され、モーダルに表示され、サブビューに同じ制約があります(superview/margins/topレイアウトガイドからの間隔は0)。

この問題は、iOS 13 SDKでビルドした場合でも、iOS 12では発生しません。これはiOS 13(ベータ8)の既知の問題ですか、それともコード/ストーリーボードで調整する必要がありますか?

17
Leon Lucardie
override func viewWillAppear(_ animated: Bool) {  
    super.viewWillAppear(animated)  
    if #available(iOS 13.0, *) {  
        navigationController?.navigationBar.setNeedsLayout()  
    }
}  

here の周りにこの作業が見つかり、うまくいきました。

19
Rod

ロッドの答えのように、私はそれが私が次のメインスレッドrunLoopにsetNeetsLayout()を入れた場合にのみ機能することを発見しました:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Workaround for iOS 13 modal gap below navigationbar
    if #available(iOS 13.0, *) {
        DispatchQueue.main.async {
            self.navigationController?.navigationBar.setNeedsLayout()
        }
    }
}
9
Jakehao