参照 here および here 。最初のリンクに回答がありません。 2番目のリンクでは、答えは受け入れられませんが、Apple開発者フォーラムへのリンクはエラーになります。
IOS 11より前:
iOS 11:
注:同じデバイスの同じコード。
また、これは、この機能を使用するすべてのアプリを再公開する必要があることを意味しますか?
これらの行を追加すると修正されました:
override func viewDidLayoutSubviews() {
self.searchController.searchBar.sizeToFit()
}
次のコードを使用して、iOS11で正しく表示される初期外観を取得できます(Gregの回答による)。
[self.searchController.searchBar sizeToFit];
if (@available(iOS 11.0, *)) {
self.navigationItem.searchController = self.searchController;
self.navigationItem.hidesSearchBarWhenScrolling = NO;
} else {
// Fallback on earlier versions
self.tableView.tableHeaderView = self.searchController.searchBar;
}
ただし、検索バーがアクティブな間にアプリがバックグラウンドにされて復元された場合、上記のNitishの2番目のスクリーンショットに示すように、外観が重なり合ってしまいます。
次の回避策で修正できました。
[[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidBecomeActiveNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
self.searchController.searchBar.showsScopeBar = NO;
[self.searchController.searchBar sizeToFit];
self.searchController.searchBar.showsScopeBar = YES;
[self.searchController.searchBar sizeToFit];
}];
(検索バーがアクティブなときにインターフェイスの向きを変更した後のレイアウトの問題を回避する方法については現在取り組んでいますが、それでも結局はオーバーラップします。)
Ray Wenderlichが提出したレーダーでは、@ benckがWWDCから answer を投稿しました。
私のアプリで同じ問題に遭遇しました。私のソリューションはiOS 11で、Apple navigationItemにあるsearchBarの新しい方法を提案しました。以下のように:
if #available(iOS 11.0, *) {
navigationController?.navigationBar.prefersLargeTitles = false
navigationItem.searchController = searchController
navigationItem.hidesSearchBarWhenScrolling = false
searchViewHeight.constant = 0
} else {
searchView.addSubview(searchController.searchBar)
}
SearchViewとsearchViewHeightの2つのIBOutletsがあります。
@IBOutlet var searchView: UIView!
@IBOutlet var searchViewHeight: NSLayoutConstraint! // new added for iOS 11
IOS 11より前は、viewControllerの階層は次のとおりです。
SearchControllerのsearchBarビューを含む高さ44のsearchViewがあります。ナビゲーションバーの下にあります。
IOS 11では、searchViewの高さ制約に新しいIBOutletを追加し、定数を0に設定して、このコンテナービューを非表示にします。そして、ナビゲーション項目の一部としてsearchControllerを追加します。
Appleのドキュメントを参照してください: https://developer.Apple.com/documentation/uikit/uinavigationitem/2897305-searchcontroller
もう1つはiOS 11の下にあります。searchBarのtextFieldの背景色は、デフォルトではナビゲーションバーの色よりも少し暗いです。一貫性を保つために、白に変更できます。以下のコードはiOS11とそれ以前の両方で機能します:
if let textField = searchController.searchBar.value(forKey: "searchField") as? UITextField {
if let backgroundView = textField.subviews.first {
// Search bar textField background color
backgroundView.backgroundColor = UIColor.white
// Search bar textField rounded corner
backgroundView.layer.cornerRadius = 10
backgroundView.clipsToBounds = true
}
}
あなたのコメントによると、あなたのUISearchController
のUISearchBar
はあなたのUITableView
のtableHeaderView
に割り当てられています。 iOS 11では、代わりにUISearchController
をビューのsearchController
のnavigationItem
プロパティに割り当てる必要があります。 UISearchBar
をどこにでも割り当てる必要がなくなりました。この新しいプロパティの Appleのドキュメント を参照してください。
解決策は、ナビゲーションバーに検索バーを追加することだと思います。
navigationController?.navigationBar.prefersLargeTitles = true // Navigation bar large titles
navigationItem.title = "Contacts"
navigationController?.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.foregroundColor : UIColor.white]
navigationController?.navigationBar.barTintColor = UIColor(displayP3Red: 0/255, green: 150/255, blue: 136/255, alpha: 1.0)
let searchController = UISearchController(searchResultsController: nil) // Search Controller
navigationItem.hidesSearchBarWhenScrolling = false
navigationItem.searchController = searchController
UISearchBarControllerの例を見つけることができます-SearchBarとスコープボタンが重複している here 。