いくつかの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:別のビューコントローラーをプッシュすると、ナビゲーション項目が重複します。
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に感謝)
(いくつかの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がリリースされ、ユーザーがそれにアップデートした場合、回避策はもう適用されていません。
これはiOS 13.2ベータで修正されたようです。Xcode11.2ベータ(11B41)を使用して上記のサンプルプロジェクトをテストしました。
それを誇りに思っているわけではありませんが、このハックで今のところ機能しています。
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() }
}