web-dev-qa-db-ja.com

画面の上部にジャンプするiOS 11検索バー

ヘッダーを検索バーに設定したUITableViewがあります。

tableView.tableHeaderView = searchController.searchBar

クリックするまではすべてが計画どおりに機能し、tableViewから切り離されて画面の上部にジャンプするようです。 tableViewの行はそのまま残ります。 iOS 10ではなくiOS 11でそれを行う理由は何ですか?

12
Tyler Rolfe

IOS 11で検索バー/検索コントローラーを表示する新しい方法を適用することをお勧めします。これが私が行ったことです:

    if #available(iOS 11.0, *) {
        navigationItem.searchController = searchController
    } else {
        tableView.tableHeaderView = searchController.searchBar
    }
12
Simon Wang

SOに関する私の最初の投稿、私はこれが正しく行われていることを願っています。

私はまったく同じ問題を抱えていて、解決策を見つけるのに本当に苦労していました。しかし、今はUISearchControllerをサブクラス化することでなんとか修正できました。

このサブクラスには2つのプロパティがあります。

var customDelegate : CustomSearchControllerDelegate!
var searchBarWithCustomSize : UISearchBar!

したがって、UISearchControllerのsearchBarを使用する代わりに、次のように、カスタムsearchControllerから新しいプロパティsearchBarWithCustomSizeを使用できます。

tableView.tableHeaderView = customSearchController.searchBarWithCustomSize

これにより、アクティブ時に検索バーが正しく動作します。また、このsearchBarWithCustomSizeを使用すると、自由度が増します。たとえば、必要に応じてフレームを変更できます。

私の実装では、検索バーのテキストフィールドがいつ変更されたかをデリゲートに知らせる必要がありますが、デリゲートの使用法は状況に依存すると思います。

4
pontusnt

私はまったく同じ問題を抱えていました-iOS10ではすべてが問題なく、iOS11でのUISearchBarの奇妙なジャンプ動作。

上記のSimon Wangのアドバイスについて-私が抱えていた問題は、UISearchBarUIViewController内に定義していないことです。代わりに、別のUITableViewCell内にいるため、私はnavigationItemにアクセスできないため、検索バーをそのように表示できません。

とにかく、多くの試行錯誤の後、物事をうまく進めるための唯一の方法は、UISearchControllerと関連するデリゲートをまとめて削ることでした。

代わりに、Interface Builder内でUISearchBarを定義し、そのレイアウト制約を適切に定義します。次に、その親クラスをUISearchBarDelegateに準拠させ、searchBar.delegate = self

次に、一連のデリゲートメソッドを追加して、コンテンツの変更を検索バーにキャッチし、それに応じてテーブルの結果を更新します。

func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {  
   filterContentForSearchText(self.searchBar.text!)
}

func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
   filterContentForSearchText(self.searchBar.text!)
   self.searchBar.resignFirstResponder()
}

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
   filterContentForSearchText(self.searchBar.text!)
}

そして人生は再び良いです。お役に立てれば!

1
Ali Parr

これを試して:

if (@available(iOS 11, *)){
    [searchVC.searchBar addObserver:self forKeyPath:@"frame" options: NSKeyValueObservingOptionNew context:nil];
}else{
    [view addSubview:searchVC.searchBar];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    CGRect rect = [change[@"new"] CGRectValue];
    if (rect.Origin.y == 14) {
        CGRect temp = rect;
        temp.Origin.y = 20;
        [self.searchVC.searchBar setValue:@(temp) forKey:@"frame"];
    }else if (rect.size.height == 56){
        CGRect temp = rect;
        temp.size.height = 50;
        [self.searchVC.searchBar setValue:@(temp) forKey:@"frame"];
    }
}
0
Wong Sam

これを試して。

if #available(iOS 11.0, *) {
    searchBar.heightAnchor.constraint(equalToConstant: 44).isActive = true
}
0
Khalil Ghaus