ヘッダーを検索バーに設定したUITableViewがあります。
tableView.tableHeaderView = searchController.searchBar
クリックするまではすべてが計画どおりに機能し、tableViewから切り離されて画面の上部にジャンプするようです。 tableViewの行はそのまま残ります。 iOS 10ではなくiOS 11でそれを行う理由は何ですか?
IOS 11で検索バー/検索コントローラーを表示する新しい方法を適用することをお勧めします。これが私が行ったことです:
if #available(iOS 11.0, *) {
navigationItem.searchController = searchController
} else {
tableView.tableHeaderView = searchController.searchBar
}
SOに関する私の最初の投稿、私はこれが正しく行われていることを願っています。
私はまったく同じ問題を抱えていて、解決策を見つけるのに本当に苦労していました。しかし、今はUISearchController
をサブクラス化することでなんとか修正できました。
このサブクラスには2つのプロパティがあります。
var customDelegate : CustomSearchControllerDelegate!
var searchBarWithCustomSize : UISearchBar!
したがって、UISearchControllerのsearchBarを使用する代わりに、次のように、カスタムsearchControllerから新しいプロパティsearchBarWithCustomSizeを使用できます。
tableView.tableHeaderView = customSearchController.searchBarWithCustomSize
これにより、アクティブ時に検索バーが正しく動作します。また、このsearchBarWithCustomSizeを使用すると、自由度が増します。たとえば、必要に応じてフレームを変更できます。
私の実装では、検索バーのテキストフィールドがいつ変更されたかをデリゲートに知らせる必要がありますが、デリゲートの使用法は状況に依存すると思います。
私はまったく同じ問題を抱えていました-iOS10ではすべてが問題なく、iOS11でのUISearchBarの奇妙なジャンプ動作。
上記のSimon Wangのアドバイスについて-私が抱えていた問題は、UISearchBar
をUIViewController
内に定義していないことです。代わりに、別の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!)
}
そして人生は再び良いです。お役に立てれば!
これを試して:
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"];
}
}
これを試して。
if #available(iOS 11.0, *) {
searchBar.heightAnchor.constraint(equalToConstant: 44).isActive = true
}