iOS 11 では、Apple は UISearchBar を再設計し、角を丸くして高さを大きくしました。UISearchBar を navigationBar に追加するのは非常に簡単で、 を使って navigationItem の titleView として設定するだけですnavigationItem.titleView = searchBar
。
しかし、iOS 11では期待通りに動作しないようです。iOS 10とiOS 11を使用して同じ設定を比較した画面をご覧ください。
SearchBar によって NavigationBar のサイズが大きくなっているのに、バーのボタンが正しく配置されていないことがはっきりとわかります。また、searchBar は左側の使用可能なスペースを使用しなくなりました。
ここで説明されているように、iPad でキャンセル ボタンを取得するには、searchBar をラッパー ビューに配置します。UISearchBarにキャンセルボタンが表示されないまた、searchBar がまったく表示されないため、動作しなくなったようです。
同様の問題を抱えている方、またはこれを修正/改善する方法をすでに知っている方がいらっしゃいましたら、大変ありがたく思います。
これは Xcode 9 Beta 4 を使用して構築されました。将来のリリースでこの問題が修正される可能性があります。
アップデート:
これは修正されないため、次のソリューションを使用することにしました。NavBar に新しい UIBarButtonItem を追加し、新しい ViewController を表示します。この ViewController には searchBar のみを配置し、NavBar には他には何も配置しませんが、これは機能しているようです。iOS 11 の Apple は、当初望んでいた結果が得られなくてもこの新しいデザインの使用を望んでいるため、選択した回答を使用するのが最善の解決策である可能性があります。これを解決するもう 1 つの方法は、カスタム SearchBar を使用することですが、これは別のトピックです。
ベストアンサー1
iOS 11 の navigationItem には新しい searchController プロパティがあります。
https://developer.apple.com/documentation/uikit/uinavigationitem/2897305-searchcontroller
こんな感じで使います…
if #available(iOS 11.0, *) {
navigationItem.searchController = searchController
} else {
// Fallback on earlier versions
navigationItem.titleView = searchController?.searchBar
}
Objective-C では、if ステートメントは次のようになります。
if (@available(iOS 11.0, *)) {
iOS 11 では、 を設定しないとnavigationItem.hidesSearchBarWhenScrolling = false
、ユーザーがスクロールして表示しない限り、検索バーは最初は非表示になることがあります。 これを false に設定すると、ユーザーがスクロールしなくても、タイトルが表示される場所の下に検索バーが重ねて表示されます。