2017-08-21 10 views
11

私は、そのヘッダを検索バーに設定したUITableViewを持っています。iOS 11の検索バーが画面上部にジャンプ

tableView.tableHeaderView = searchController.searchBar 

あなたがそれをクリックするまで、すべてが計画どおりに動作し、それは一見のtableViewから切り離し、画面の一番上にジャンプします。 tableView行はそのまま残ります。 iOS 11ではなくiOS 10でそれを行う理由は何ですか?

+0

再生する情報が不十分です。テーブルビューのテーブルヘッダービューを検索コントローラの検索バーに設定すると、iOS 11ではまだ問題なく動作します。 – matt

答えて

2

私の最初の投稿は、私はこの権利をしていると思います。

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

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

var customDelegate : CustomSearchControllerDelegate! 
var searchBarWithCustomSize : UISearchBar! 

ので、代わりのUISearchControllerの検索バーを使用して、私は今、このように、私のカスタムsearchControllerから新しいプロパティsearchBarWithCustomSizeを使用することができます。

tableView.tableHeaderView = customSearchController.searchBarWithCustomSize 

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

私の実装では、検索バーのテキストフィールドが変更されたことをデリゲートが知る必要がありますが、デリゲートの使用状況は状況によって異なります。

ここではiOSの11 上の検索バー/検索コントローラを表示するための新しい方法は、私がやっていることである適用することが推奨されて
+1

クラス全体のコードを投稿できますか?ありがとう。 –

+0

コードのコードやワークフローを表示すると、非常に便利です。 –

7

if #available(iOS 11.0, *) { 
     navigationItem.searchController = searchController 
    } else { 
     tableView.tableHeaderView = searchController.searchBar 
    } 
+0

ありがとう@サイモン王!この解決策を探していました!検索バーを常に表示するには、次のように追加します。 navigationItem.hidesSearchBarWhenScrolling = NO; – Bionicle

0

を私は正確に同じ問題が持っていた - の奇妙なジャンプの動作をiOS11上のUISearchBar、iOS10上のすべてが問題ありません。

上記サイモン王によってアドバイスについて - 「ので、それゆえ、私はnavigationItemへのアクセス権を持っていることができません - 私はUIViewController内部の私のUISearchBarを定義するわけではないということがあり、私は別のUITableViewCell内代わりにしていた問題そのように私の検索バーを表示しないでください。

とにかく多くの試行錯誤の末、私が仕事を得ることができる唯一の方法は、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!) 
} 

そして人生ですもう一度良い。 これが役立つことを願っています!

0

はこれを試してみてください:

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

はこれを試してみてください。

if #available(iOS 11.0, *) { 
    searchBar.heightAnchor.constraint(equalToConstant: 44).isActive = true 
} 
関連する問題