web-dev-qa-db-ja.com

UISearchControllerを使用すると、iOS 13のUIBarButtonItemがクリックできず、UINavigationBarが重複する

いくつかのUIBarButtonItemボタンとUISearchBarを含むナビゲーションバーがこのように接続されました

var searchController: UISearchController!

override func viewDidLoad() {
    super.viewDidLoad()

    title = "Test"

    tableView.delegate = self
    tableView.dataSource = self

    searchController = UISearchController(searchResultsController: nil)
    navigationItem.searchController = searchController

    // This leads to the bug
    searchController.hidesNavigationBarDuringPresentation = false

    navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(leftTapped))
    navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .action, target: self, action: #selector(rightTapped))
}

シナリオ:検索バーをタップして、後で[キャンセル]をタップします。

  • 問題1:バーボタンが反応しない、画面の最も外側のピクセルをタッチした場合を除いて(シミュレータとマウスクリックでのみ可能) 。

  • 問題2:別のビューコントローラーをプッシュすると、ナビゲーション項目が重複します

enter image description here

hidesNavigationBarDuringPresentation = trueを使用すると、期待どおりに動作します。


この問題は、Xcode 11.0および11.1を使用した、ノッチ付きおよびノッチなしのiPhone iOS 13.0および13.1で発生します。

テストプロジェクト全体を次に示します。 https://github.com/fl034/HidesNavigationBarDuringPresentationTest


私はレーダーを提出しました(そしてあなたもそうすべきです)が、おそらくあなたたちの何人かはすでにそれの回避策を持っていますか?


アップデート1:iOS 13.1.1にはまだバグがあります


アップデート2:iOS 13.2ベータでバグが修正されました(@Ben Gommに感謝)

37
fl034

ビューデバッガーは、このバグで何が起こっているかを明らかにします。ナビゲーションバーの内容をコピーしています。検索を表示する前のナビゲーションバーは次のようになります。

enter image description here

そして、それはその後それがどのように見えるかです:

enter image description here

2つのレプリカントビューと余分なUILabelが問題です。彼らがそこで何をしているのかわからないし、それらを削除する方法を見つけることができません。

[〜#〜] edit [〜#〜]ちなみに、Appleのアプリの中には同じバグを表示しているものがあると思います。タイトルが大きい場合は、大きいタイトルと追加のラベルを同時に表示できるため、簡単に確認できます。

enter image description here

8
matt

(いくつかのapp-ux固有の理由により)検索がアクティブな間、ほとんどのユーザーにナビゲーションバーを表示したいので、この回避策を使用しています。

var isIosVersionWithNavigationBarBug: Bool {
    if #available(iOS 13.2, *) {
        return false
    }
    if #available(iOS 13.0, *) {
        return true
    }        
    return false
}

私の検索コントローラーでは、次のように使用します

mySearchController.hidesNavigationBarDuringPresentation = isIosVersionWithNavigationBarBug

そのため、iOS 13.2がリリースされ、ユーザーがそれにアップデートした場合、回避策はもう適用されていません。

6
fl034

これはiOS 13.2ベータで修正されたようです。Xcode11.2ベータ(11B41)を使用して上記のサンプルプロジェクトをテストしました。

3
Ben Gomm

それを誇りに思っているわけではありませんが、このハックで今のところ機能しています。

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    let viewsToRemove = self.navigationController?.navigationBar.subviews.flatMap({ (view) in
        view.subviews.filter { type(of: $0) == UILabel.self }
    })
    viewsToRemove?.forEach { $0.removeFromSuperview() }
}
0
senthilvkumar