web-dev-qa-db-ja.com

テーブルヘッダービューでUISearchControllerによって表示されたUISearchBarは、アクティブなときにアニメーションが遠すぎます

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つの回答 に重なるため)

これは、非アクティブのときに完全に正しい位置にあるように見えます: Inactive search bar in correct position

検索バーはアクティブなときはそのままの場所にある必要があります-ナビゲーションバーを非表示にするために検索バーを上に移動させたくないのです。しかし、予期せず下に移動し、ナビゲーションバーとの間に空白が残ります。

Screenshot showing search bar animated too far down

奇妙な検索バーアニメーションのビデオ

UISearchControllerとは別に検索バーを使用するだけの場合、アクティブになったときに同じ動作を示しません。

提示するView Controllerには、self.definesPresentationContext = YES;およびself.navigationController.navigationBar.translucent = YES;、およびIBでは、「エッジの延長」ボックスはいずれもアクティブではありません(すべて、読み回しから検索プレゼンテーションを放り出す可能性があるものと思われました)。

検索バーのアニメーションを停止する方法を知っている人はいますか?

56
Zoë Smith

わかりましたので、私は最終的に自分のための解決策を考え出した。私たちのコード/ストーリーボードには他のものがある可能性が高いですが(これが答えるのが難しい質問です)、ほとんどの場合、私はUISearchControllerに関するAppleのチュートリアルに従いました:( https://developer.Apple。 com/library/ios/samplecode/TableSearch_UISearchController/Introduction/Intro.html

ほぼすべてのコードはそれらのものと同じですが、その内部をクリックしたときに検索バーがジャンプしないようにすることはできませんでした。そこで、ストーリーボードの元のテーブルビューと検索結果のテーブルビューの両方について、「不透明なバーの下」をチェックしました。検索バーがジャンプを停止しました。

しかし、最後の問題が1つありました。それは、結果テーブルビューの最初の行が検索バーによって非表示になったという事実でした。これを修正するために、結果テーブルビューのviewDidLoadメソッドにself.tableView.contentInset = UIEdgeInsetsMake(kHeightOfTableViewCells, 0, 0, 0);を追加しました。出来上がり!

28
Brian Sachetta

古い質問ですが、設定することでこの問題を解決できました

self.extendedLayoutIncludesOpaqueBars = YES;

私のView Controllerで。問題は、不透明なナビゲーションバーがあるが、検索コントローラーでhidesNavigationBarDuringPresentationNOに設定することによって発生し、フォーカス時に検索バーが正しく配置されないことが原因だと思います。

65
ppilone

ViewControllerから次の行を削除することで、UISearchBarが下にシフトするのを防ぐことができました:self.definesPresentationContext = YES;

28
Piotr Tomasik

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
22
Gleb

私の番。 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に適用)

16
Sozin's Comet

私は最近この問題に出くわしましたが、解決策はありませんでした。とにかく、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つ追加します:コントローラーのすべての階層を不透明バーとトップバーの下に拡張するように設定した後、検索バーがナビゲーションバーの下に隠れて表示され始め、回転が起こった直後に現れました。それは、レイアウトエラーがいくつかあり、レイアウトが正しくなかったがいくつかの情報があるという私にとっての手がかりでした。このデリゲートメソッドは、他の方法では遊牧民の検索バーに関する状況をコントローラーが理解するのに役立ちます!

14
M. Porooshani

それを見つけた!これは、提示するvcのviewDidLoadの攻撃的な行のようです:

self.edgesForExtendedLayout = UIRectEdgeNone;

それを削除し、検索バーは予測どおりに固定されました。

6
Zoë Smith

オフスクロールビューインセットの調整

そして

チェック上のバーの下

修正済み私の問題 enter image description here

4
Basil Mariano

iOS 11の場合、Swift 4、viewControllerで以下の行を設定すると、問題が解決しました(searchBarが下にジャンプします):

self.edgesForExtendedLayout = .bottom
2
side

UISearchBar frame.original.y = 64

コードがあります

if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) {
    [self setEdgesForExtendedLayout:UIRectEdgeNone];
}

searchBar.frame = CGRectMake(0, 0, 376, 44);

洗浄はあなたを助けることができます

1
Hawe

最初の投稿で述べたように、誰もが別のソリューションを必要としていました。これが私のものです。このページで言及した2つのこと、つまり、次のことを組み合わせる必要がありました。

スイフト2:

    navigationController?.navigationBar.translucent = true

    edgesForExtendedLayout = .None
0
hashier

UINavigationControllerおよびTabBarを使用する場合、できません

self.extendedLayoutIncludesOpaqueBars = true

このソリューションが必要になります: https://stackoverflow.com/a/46151063/3369381

0
demylia

私の場合、ナビゲーションバーをself.navigationController.navigationBar.translucent = NO;に設定すると問題が修正されました。検索バーのレイアウトでは、検索バーのプレゼンテーションレイヤーはナビゲーションバーの半透明性を考慮していないようです。

ナビゲーションバーの半透明性は他の場所のレイアウトを無効にする可能性があるため、これは完璧なソリューションではないことを認識していますが、少なくとも半透明でないナビゲーションバーが可能性がある場合の問題を修正します。

0
Alex Medearis

その非常にシンプルな操作は、検索バーのテーブルビューのヘッダービューのclipsToBounds = trueを追加するだけです。

countryTableView.tableHeaderView?.clipsToBounds = true
0
Prit_Singh