IOS 11では、AppleはUISearchBarを再設計し、角を丸くし、高さを大きくしました。 navigationItem.titleView = searchBar
を使用してそれをnavigationItemのtitleViewとして設定するだけで、navigationBarにUISearchBarを追加するのはとても簡単です。
しかし、iOS 11では、期待通りに動作しなくなりました。 iOS 10とiOS 11を使って同じ設定を比較した画面を見てください。
SearchBarはNavigationBarのサイズを大きくしますが、バーボタンは正しく配置されません。またsearchBarは左側の利用可能なスペースをもう使用しません。
ここで説明されているように、検索バーをラッパービューに入れてiPadのキャンセルボタンを取得する キャンセルボタンはUISearchBarには表示されません また、検索バーがまったく表示されないため、動作しなくなります。
誰かが同様の問題を抱えているか、これを修正または改善する方法をすでに知っているならば、私は非常に感謝するでしょう。
これはXcode 9 Beta 4を使って構築されました。将来のリリースでこの問題は修正されるかもしれません。
更新:
これは修正されないので、我々は以下の解決策を使用することにしました。私たちは新しいUIBarButtonItemをNavBarに追加しました。それは新しいViewControllerを表示します。ここではsearchBarだけを入れ、NavBarには他には何も機能しないようです。 iOS 11を搭載したAppleは、当初望んでいた結果が得られない場合でも、この新しいデザインを使用することを望んでいるため、選択した回答を使用することが最善の解決策となる可能性があります。これを解決するためのもう1つの方法はカスタムのSearchBarですが、これは別のトピックです。
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に設定すると、ユーザーがスクロールしなくてもタイトルが表示される場所の下に重ねて表示されます。
IOS 11でUISearchBarの高さを変更するには、高さ44の拘束を追加します。
if #available(iOS 11.0, *) {
searchBar.heightAnchor.constraint(equalToConstant: 44.0).isActive = true
}
私は同じ問題を抱えていました、そして、問題をgooglingした数日後に、私はこのページを見つけました - https://translate.google.com/translate?hl=ja&sl=zh-CN&u=http://www。 jianshu.com/p/262f6e34a7d3&prev=search .
このページはこのgitリポジトリにつながります--- https://github.com/DreamTravelingLight/searchBarDemo - このデモプロジェクトは、titleViewで古い方法を使用して、まだサイズ変更の問題がないままsearchBarを使用する方法を示しています。
キーラインはこれらです
_searchBar = [self addSearchBarWithFrame:CGRectMake(0, 0, kScreenWidth - 2 * 44 - 2 * 15, 44)];
UIView *wrapView = [[UIView alloc] initWithFrame:_searchBar.frame];
[wrapView addSubview:_searchBar];
self.navigationItem.titleView = wrapView;
UISearchBarをビュー内に埋め込み、そのwrapViewをtitleViewとして設定した場合、UISearchBarはそれに設定したサイズになり、意図したとおりにナビゲーションバーに収まります。
ありがとう、David
これは私を助けました:
if ([self.navigationItem respondsToSelector:@selector(setSearchController:)])
{
[self.navigationItem performSelector:@selector(setSearchController:) withObject:self.searchController];
}
else
{
self.tableView.tableHeaderView = self.searchController.searchBar;
}
IOS 11+のUISearchBar
でネイティブのnavigationBar
を使用したい(そしてカスタムコンポーネントを作成する必要がない)場合は、コンテナを作成できますそのsearchBar
を見て、フレームを完全に制御できます。このコンテナビューは、渡したsearchBar
のスーパービューになります。
なにか:
class SearchBarContainerView: UIView {
let searchBar: UISearchBar
required init?(coder aDecoder: NSCoder) {
searchBar = UISearchBar()
super.init(coder: aDecoder)
}
init(searchBar: UISearchBar) {
self.searchBar = searchBar
super.init(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 44.0))
addSubview(searchBar)
}
override func layoutSubviews() {
super.layoutSubviews()
searchBar.frame = bounds
}
}
そしてそれから:
let containerView = SearchBarContainerView(searchBar: searchController.searchBar)
containerView.frame.size.width = navigationController?.navigationBar.frame.size.width ?? 0.0
navigationItem.titleView = containerView
注これは素早いデモであり、
navigationBar
フレームの変更(ディスプレイの回転など)には対応していません。あなたはそれを解決することができます。autoresizingMask
。
新しいUINavigationItem.searchControllerプロパティをUISearchControllerオブジェクトに設定する必要があると思います。これが、メッセージに見られる新しい効果を得る方法です。古い動作は単純になくなっているようです。私が間違っていることを願っていますが、API全体が11でオーバーホールされました。一般的にバグがあることはわかっているので、新しいベータ版とこれが修正されればGMが表示されます。 (ベータ6の時点で記述)