57

UISearchController を使用して、テーブルビューのヘッダー ビュー内に検索バーを表示しています。

...
self.searchController.hidesNavigationBarDuringPresentation = NO;            
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;
[self.searchController.searchBar sizeToFit];
self.presentingTVC.tableView.tableHeaderView = self.searchController.searchBar;

(そうしないと、ヘッダービューが最初の行と重なるため、 tableHeaderView プロパティを2回設定する必要があります。 SO に関するいくつかの回答を参照してください)

これは、非アクティブ時の完全な位置での外観です。 正しい位置にある非アクティブな検索バー

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

検索バーが下に移動しすぎているアニメーションを示すスクリーンショット

これは奇妙な検索バーのアニメーションの ビデオです

UISearchController とは別に検索バーを使用すると、アクティブになったときに同じ動作が表示されません。

私の提示ビューコントローラーにはself.definesPresentationContext = YES;とがself.navigationController.navigationBar.translucent = YES;あり、IB では「エッジの拡張」ボックスはどれもアクティブではありません (すべて、読み回して検索プレゼンテーションをオフにする可能性があるようです)。

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

4

15 に答える 15

69

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

self.extendedLayoutIncludesOpaqueBars = YES;

私のビューコントローラで。この問題は、ナビゲーション バーが不透明で、検索コントローラーに設定hidesNavigationBarDuringPresentationNOれていることが原因であると考えられます。これにより、フォーカス時に検索バーが正しく配置されません。

于 2015-11-05T05:16:36.143 に答える
30

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

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

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

于 2015-02-06T19:20:11.503 に答える
28

UISearchBarViewController から次の行を削除することで、シフトダウン を防ぐことができました。self.definesPresentationContext = YES;

于 2015-04-08T09:20:52.783 に答える
15

最近この問題に遭遇しましたが、どの解決策もうまくいきませんでした。とにかく、私のUIがより複雑であるためです(検索を含む私のテーブルビューは、UiNavigationController内のUITabControllerに含まれています)、上記のワーカーはありません。私が見つけたこの非常にきちんとしたコードによって、私の問題を簡単に解決できました: UISearchController Not Redisplaying Navigation Bar on Rotate

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
{
    if (bar == searchController.searchBar) {
        return UIBarPositionTopAttached;
    }
    else { // Handle other cases
        return UIBarPositionAny;
    }
}

追加するもう1つのこと:すべてのコントローラーの階層を不透明バーとトップバーの下に拡張するように設定した後、検索バーがナビゲーションバーの下に隠れて表示され始め、回転が発生した直後に表示されました. これは、レイアウト エラーがあり、レイアウトに関連する情報が正しくないことを示す手がかりでした。このデリゲート メソッドは、コントローラーがノマド検索バーの状況を理解するのに役立ちます!

于 2015-05-03T05:17:27.953 に答える
6

それを見つけた!viewDidLoadこれは、提示している vcの不快な行のようです。

self.edgesForExtendedLayout = UIRectEdgeNone;

それを削除すると、検索バーは予測どおりに残りました。

于 2015-02-05T23:42:45.510 に答える
1

UISearchBar を設定したと思いますframe.original.y = 64

コードがあります

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

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

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

于 2016-05-06T02:33:55.973 に答える
0

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

スウィフト 2:

    navigationController?.navigationBar.translucent = true

    edgesForExtendedLayout = .None
于 2016-06-07T14:19:58.157 に答える
0

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

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

于 2015-07-23T18:27:52.930 に答える