UISearchControllerを使用して、tableviewのヘッダービュー内に検索バーを表示しています。
...
self.searchController.hidesNavigationBarDuringPresentation = NO;
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
[self.searchController.searchBar sizeToFit];
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
(tableHeaderViewプロパティを2回設定する必要があります。そうしないと、ヘッダービューが最初の行c.f . S.O。に関する2つの回答 に重なるため)
これは、非アクティブのときに完全に正しい位置にあるように見えます:
検索バーはアクティブなときはそのままの場所にある必要があります-ナビゲーションバーを非表示にするために検索バーを上に移動させたくないのです。しかし、予期せず下に移動し、ナビゲーションバーとの間に空白が残ります。
UISearchControllerとは別に検索バーを使用するだけの場合、アクティブになったときに同じ動作を示しません。
提示するView Controllerには、self.definesPresentationContext = YES;
およびself.navigationController.navigationBar.translucent = YES;
、およびIBでは、「エッジの延長」ボックスはいずれもアクティブではありません(すべて、読み回しから検索プレゼンテーションを放り出す可能性があるものと思われました)。
検索バーのアニメーションを停止する方法を知っている人はいますか?
わかりましたので、私は最終的に自分のための解決策を考え出した。私たちのコード/ストーリーボードには他のものがある可能性が高いですが(これが答えるのが難しい質問です)、ほとんどの場合、私はUISearchControllerに関するAppleのチュートリアルに従いました:( https://developer.Apple。 com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html )
ほぼすべてのコードはそれらのものと同じですが、その内部をクリックしたときに検索バーがジャンプしないようにすることはできませんでした。そこで、ストーリーボードの元のテーブルビューと検索結果のテーブルビューの両方について、「不透明なバーの下」をチェックしました。検索バーがジャンプを停止しました。
しかし、最後の問題が1つありました。それは、結果テーブルビューの最初の行が検索バーによって非表示になったという事実でした。これを修正するために、結果テーブルビューのviewDidLoad
メソッドにself.tableView.contentInset = UIEdgeInsetsMake(kHeightOfTableViewCells, 0, 0, 0);
を追加しました。出来上がり!
古い質問ですが、設定することでこの問題を解決できました
self.extendedLayoutIncludesOpaqueBars = YES;
私のView Controllerで。問題は、不透明なナビゲーションバーがあるが、検索コントローラーでhidesNavigationBarDuringPresentation
をNO
に設定することによって発生し、フォーカス時に検索バーが正しく配置されないことが原因だと思います。
ViewControllerから次の行を削除することで、UISearchBar
が下にシフトするのを防ぐことができました:self.definesPresentationContext = YES;
definesPresentationContext = true
override func viewDidLoad() {
super.viewDidLoad()
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = true
searchController.searchBar.searchBarStyle = UISearchBarStyle.Prominent
self.tableView.tableHeaderView = searchController.searchBar
definesPresentationContext = true
私の番。 WWDCサンプルコードを実行したときにもこの問題が発生しました。
SearchBarのscopeButtonTitlesプロパティを設定しないと、searchBarが表示されないことに気付きました。よく調べてみると、CGRectZeroのフレームがありました。つまり、scopeButtonTitlesを設定すると、舞台裏のフレームが設定されます。したがって、scopeButtonTitlesを表示したくないが、UISearchBarを特定の高さにハードコードする必要がない場合は、scopeButtonTitlesを空の配列に設定します。
self.searchController = UISearchController(searchResultsController: nil)
self.searchController.searchResultsUpdater = self
self.searchController.searchBar.scopeButtonTitles = []
self.tableView.tableHeaderView = self.searchController.searchBar
ScopeButtonTitlesを1文字列の配列に設定すると、スコープボタンのタイトルは表示されませんが、ビューを処理するロジックがあり、基本的にレイアウトが台無しになります。
AppleのQAチームの小道具(iOS 8に適用)
私は最近この問題に出くわしましたが、解決策はありませんでした。とにかく、UIがより複雑であるため(検索付きのテーブルビューは、UiNavigationController内のUITabControllerに含まれています)、上記のワーカーはありません。次の場所にあるこの非常にきれいなコードで問題を簡単に解決できました: ISearchController Not Rotation on Navigation Bar on Rotate
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
{
if (bar == searchController.searchBar) {
return UIBarPositionTopAttached;
}
else { // Handle other cases
return UIBarPositionAny;
}
}
もう1つ追加します:コントローラーのすべての階層を不透明バーとトップバーの下に拡張するように設定した後、検索バーがナビゲーションバーの下に隠れて表示され始め、回転が起こった直後に現れました。それは、レイアウトエラーがいくつかあり、レイアウトが正しくなかったがいくつかの情報があるという私にとっての手がかりでした。このデリゲートメソッドは、他の方法では遊牧民の検索バーに関する状況をコントローラーが理解するのに役立ちます!
それを見つけた!これは、提示するvcのviewDidLoad
の攻撃的な行のようです:
self.edgesForExtendedLayout = UIRectEdgeNone;
それを削除し、検索バーは予測どおりに固定されました。
iOS 11の場合、Swift 4、viewControllerで以下の行を設定すると、問題が解決しました(searchBarが下にジャンプします):
self.edgesForExtendedLayout = .bottom
UISearchBar frame.original.y = 64
コードがあります
if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
[self setEdgesForExtendedLayout:UIRectEdgeNone];
}
searchBar.frame = CGRectMake(0, 0, 376, 44);
洗浄はあなたを助けることができます
最初の投稿で述べたように、誰もが別のソリューションを必要としていました。これが私のものです。このページで言及した2つのこと、つまり、次のことを組み合わせる必要がありました。
スイフト2:
navigationController?.navigationBar.translucent = true
edgesForExtendedLayout = .None
UINavigationController
およびTabBar
を使用する場合、できません:
self.extendedLayoutIncludesOpaqueBars = true
このソリューションが必要になります: https://stackoverflow.com/a/46151063/3369381
私の場合、ナビゲーションバーをself.navigationController.navigationBar.translucent = NO;
に設定すると問題が修正されました。検索バーのレイアウトでは、検索バーのプレゼンテーションレイヤーはナビゲーションバーの半透明性を考慮していないようです。
ナビゲーションバーの半透明性は他の場所のレイアウトを無効にする可能性があるため、これは完璧なソリューションではないことを認識していますが、少なくとも半透明でないナビゲーションバーが可能性がある場合の問題を修正します。
その非常にシンプルな操作は、検索バーのテーブルビューのヘッダービューのclipsToBounds = trueを追加するだけです。
countryTableView.tableHeaderView?.clipsToBounds = true