IOS7専用アプリを作成しています。 UISearchDisplayControllerをナビゲーションバーに設定しようとしています。
次のように設定しました。ストーリーボードで、ビューコントローラのビューに「検索バーと検索ディスプレイコントローラ」を追加し、上部のレイアウトガイドに対して(0,0)に設定しました。制約を左、上、右に固定するように設定しました。 (制約を試してみました。完全に削除しました。問題ではありません)その上に、テーブルビューがあります。ストーリーボードのビューに検索バーを追加すると、searchDisplayControllerとsearchBarデリゲートのアウトレットが自動的に設定されます。コードにはself.searchDisplayController.displaysSearchBarInNavigationBar = YES;
があります。2つの問題があります。
1)検索バーにボタンが表示されていない場合(Interface Builder->検索バーの選択->オプション:選択なし)、検索バーは画面の中央にあります。
ナビゲーションバーをクリックすると、検索バーの編集が始まります。
暗いオーバーレイがナビゲーションバーからオフセットされているように見えることにも注意してください。スペースはナビゲーションバーと同じ高さのようです。それだけシフトダウンしたように。また、検索結果を表示すると、コンテンツビューの上部が同じ量だけ下に移動します(さらに写真が続きます)。これにより、2番目の問題が発生します。
2)しばらくいじって、キャンセルボタンを表示するオプションをチェックすることにしました。これで、検索バーがナビゲーションバーに正しく埋め込まれましたが、オーバーレイはまだ下にシフトしています。
ここでも、検索結果テーブルビューが表示されると、同じ量だけ下にシフトされます(右側のスクロールバーに注意してください)。
さらに奇妙なことに、検索ディスプレイコントローラーのテーブルビューレイヤーに境界線を設定すると、正しく表示されます。
私はこれまでUISearchDisplayControllerを使用したことがなく、その設定方法に慣れていませんが、機能的には正常に機能します。私は他のいくつかの同様の投稿を読みましたが、唯一のアドバイスは、フレームを調整し、手動オフセットを設定することによってそれをハックすることです。何が原因なのか知りたいのですが、バグですか?私が間違っていることはありますか?バグの場合は、修正を待つことができます。千人が問題なくやったはずの基本的なことのように思えるので、どういうわけか正しく設定されていない気がします。ご入力いただきありがとうございます。
私はあなたが観察しているのとまったく同じ問題に遭遇したことを覚えています。あなたが試すことができるいくつかの解決策があるかもしれません。
ストーリーボードを使用している場合テーブルビュー用に設定したViewControllerまたはTableViewControllerをクリックし、その属性インスペクターに移動して、ViewControllerセクションを確認し、ExtendEdgesセクションを下に設定する必要があります。トップバー。
ストーリーボードを使用していない場合 viewcontrollersのedgesForExtendedLayoutプロパティを使用して手動で設定を設定でき、それでうまくいくはずです。絵コンテを使っていました。
私の場合、ストーリーボードを使用して、上部のバーの下と不透明なバーの下の両方をチェックし、下部のバーの下をオフのままにする必要がありました。
私の場合、検索バーがそれ自体をオフセットしないようにするために、ストーリーボードのすべての拡張エッジボックス(基本的にはプログラムで拡張エッジをUIRectEdgeNone
に設定するのと同じ)をオフにする必要がありました。君たちありがとう!
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
またはを参照してください テーブルヘッダービューでUISearchControllerによって提示されたUISearchBarは、アクティブなときにアニメーションが大きすぎます
私の問題はただスクロールビューの挿入を調整するでした。 falseに変更した後、問題はありませんでした
私は非常によく似た行動をしました。私にとっての解決策は、親ビューコントローラーのストーリーボード設定で[トップバーの下のエッジを拡張]のチェックを外すことでした(透明なナビゲーションバーをオフにしましたが、それが何かに影響するかどうかはわかりません)。ストーリーボードを使用していない場合は、[UIViewControlleredgesForExtendedLayout]を設定する必要があります。
Appleドキュメントから:
このプロパティは、UINavigationControllerやUITabBarControllerなどのコンテナに埋め込まれているビューコントローラにのみ適用されます。ルートビューコントローラーとして設定されたビューコントローラーは、このプロパティに反応しません。デフォルト値はUIRectEdgeAllです。
私も同じ問題を抱えていました。そして、テーブルビューの下にビューオブジェクトを追加することで、この問題を解決します。
残念ながら、上記の解決策はどれもうまくいきませんでした。私はUITableViewController
を使用しています。
このリンクは役に立ちました:
http://petersteinberger.com/blog/2013/fixing-uisearchdisplaycontroller-on-ios-7/
便宜上、以下のコードを配置します。
static UIView *PSPDFViewWithSuffix(UIView *view, NSString *classNameSuffix) {
if (!view || classNameSuffix.length == 0) return nil;
UIView *theView = nil;
for (__unsafe_unretained UIView *subview in view.subviews) {
if ([NSStringFromClass(subview.class) hasSuffix:classNameSuffix]) {
return subview;
}else {
if ((theView = PSPDFViewWithSuffix(subview, classNameSuffix))) break;
}
}
return theView;
}
- (void)correctSearchDisplayFrames {
// Update search bar frame.
CGRect superviewFrame = self.searchDisplayController.searchBar.superview.frame;
superviewFrame.Origin.y = 0.f;
self.searchDisplayController.searchBar.superview.frame = superviewFrame;
// Strech dimming view.
UIView *dimmingView = PSPDFViewWithSuffix(self.view, @"DimmingView");
if (dimmingView) {
CGRect dimmingFrame = dimmingView.superview.frame;
dimmingFrame.Origin.y = self.searchDisplayController.searchBar.frame.size.height;
dimmingFrame.size.height = self.view.frame.size.height - dimmingFrame.Origin.y;
dimmingView.superview.frame = dimmingFrame;
}
}
- (void)setAllViewsExceptSearchHidden:(BOOL)hidden animated:(BOOL)animated {
[UIView animateWithDuration:animated ? 0.25f : 0.f animations:^{
for (UIView *view in self.tableView.subviews) {
if (view != self.searchDisplayController.searchResultsTableView &&
view != self.searchDisplayController.searchBar) {
view.alpha = hidden ? 0.f : 1.f;
}
}
}];
}
// This fixes UISearchBarController on iOS 7. rdar://14800556
- (void)correctFramesForSearchDisplayControllerBeginSearch:(BOOL)beginSearch {
if (PSPDFIsUIKitFlatMode()) {
[self.navigationController setNavigationBarHidden:beginSearch animated:YES];
dispatch_async(dispatch_get_main_queue(), ^{
[self correctSearchDisplayFrames];
});
[self setAllViewsExceptSearchHidden:beginSearch animated:YES];
[UIView animateWithDuration:0.25f animations:^{
self.searchDisplayController.searchResultsTableView.alpha = beginSearch ? 1.f : 0.f;
}];
}
}
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
[self correctFramesForSearchDisplayControllerBeginSearch:YES];
}
- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {
[self correctSearchDisplayFrames];
}
- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
[self correctFramesForSearchDisplayControllerBeginSearch:NO];
}
- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
// HACK: iOS 7 requires a cruel workaround to show the search table view.
if (PSPDFIsUIKitFlatMode()) {
controller.searchResultsTableView.contentInset = UIEdgeInsetsMake(self.searchDisplayController.searchBar.frame.size.height, 0.f, 0.f, 0.f);
}
}