web-dev-qa-db-ja.com

ナビゲーションバーのiOS 11検索バー

IOS 11では、AppleはUISearchBarを再設計し、角を丸くし、高さを大きくしました。 navigationItem.titleView = searchBarを使用してそれをnavigationItemのtitleViewとして設定するだけで、navigationBarにUISearchBarを追加するのはとても簡単です。

しかし、iOS 11では、期待通りに動作しなくなりました。 iOS 10とiOS 11を使って同じ設定を比較した画面を見てください。

iOS 10enter image description here

iOS 11enter image description here

SearchBarはNavigationBarのサイズを大きくしますが、バーボタンは正しく配置されません。またsearchBarは左側の利用可能なスペースをもう使用しません。

ここで説明されているように、検索バーをラッパービューに入れてiPadのキャンセルボタンを取得する キャンセルボタンはUISearchBarには表示されません また、検索バーがまったく表示されないため、動作しなくなります。

誰かが同様の問題を抱えているか、これを修正または改善する方法をすでに知っているならば、私は非常に感謝するでしょう。

これはXcode 9 Beta 4を使って構築されました。将来のリリースでこの問題は修正されるかもしれません。

更新:

これは修正されないので、我々は以下の解決策を使用することにしました。私たちは新しいUIBarButtonItemをNavBarに追加しました。それは新しいViewControllerを表示します。ここではsearchBarだけを入れ、NavBarには他には何も機能しないようです。 iOS 11を搭載したAppleは、当初望んでいた結果が得られない場合でも、この新しいデザインを使用することを望んでいるため、選択した回答を使用することが最善の解決策となる可能性があります。これを解決するためのもう1つの方法はカスタムのSearchBarですが、これは別のトピックです。

69
PatrickDotStar

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に設定すると、ユーザーがスクロールしなくてもタイトルが表示される場所の下に重ねて表示されます。

51
Justin Domnitz

IOS 11でUISearchBarの高さを変更するには、高さ44の拘束を追加します。

if #available(iOS 11.0, *) {
    searchBar.heightAnchor.constraint(equalToConstant: 44.0).isActive = true
}
16
zgjie

私は同じ問題を抱えていました、そして、問題を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

4
David Schechter

これは私を助けました:

    if ([self.navigationItem respondsToSelector:@selector(setSearchController:)])
    {
        [self.navigationItem performSelector:@selector(setSearchController:) withObject:self.searchController];
    }
    else
    {
        self.tableView.tableHeaderView = self.searchController.searchBar;
    }
1
Raunak

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

1
Jakub Truhlář

新しいUINavigationItem.searchControllerプロパティをUISearchControllerオブジェクトに設定する必要があると思います。これが、メッセージに見られる新しい効果を得る方法です。古い動作は単純になくなっているようです。私が間違っていることを願っていますが、API全体が11でオーバーホールされました。一般的にバグがあることはわかっているので、新しいベータ版とこれが修正されればGMが表示されます。 (ベータ6の時点で記述)

1
cook