web-dev-qa-db-ja.com

ナビゲーションバーに埋め込まれたときのiOS7での奇妙なUISearchDisplayControllerビューオフセット動作

IOS7専用アプリを作成しています。 UISearchDisplayControllerをナビゲーションバーに設定しようとしています。

次のように設定しました。ストーリーボードで、ビューコントローラのビューに「検索バーと検索ディスプレイコントローラ」を追加し、上部のレイアウトガイドに対して(0,0)に設定しました。制約を左、上、右に固定するように設定しました。 (制約を試してみました。完全に削除しました。問題ではありません)その上に、テーブルビューがあります。ストーリーボードのビューに検索バーを追加すると、searchDisplayControllerとsearchBarデリゲートのアウトレットが自動的に設定されます。コードにはself.searchDisplayController.displaysSearchBarInNavigationBar = YES;があります。2つの問題があります。

1)検索バーにボタンが表示されていない場合(Interface Builder->検索バーの選択->オプション:選択なし)、検索バーは画面の中央にあります。

enter image description here

ナビゲーションバーをクリックすると、検索バーの編集が始まります。

enter image description here

暗いオーバーレイがナビゲーションバーからオフセットされているように見えることにも注意してください。スペースはナビゲーションバーと同じ高さのようです。それだけシフトダウンしたように。また、検索結果を表示すると、コンテンツビューの上部が同じ量だけ下に移動します(さらに写真が続きます)。これにより、2番目の問題が発生します。

2)しばらくいじって、キャンセルボタンを表示するオプションをチェックすることにしました。これで、検索バーがナビゲーションバーに正しく埋め込まれましたが、オーバーレイはまだ下にシフトしています。

enter image description here

ここでも、検索結果テーブルビューが表示されると、同じ量だけ下にシフトされます(右側のスクロールバーに注意してください)。

enter image description here

さらに奇妙なことに、検索ディスプレイコントローラーのテーブルビューレイヤーに境界線を設定すると、正しく表示されます。

enter image description here

私はこれまでUISearchDisplayControllerを使用したことがなく、その設定方法に慣れていませんが、機能的には正常に機能します。私は他のいくつかの同様の投稿を読みましたが、唯一のアドバイスは、フレームを調整し、手動オフセットを設定することによってそれをハックすることです。何が原因なのか知りたいのですが、バグですか?私が間違っていることはありますか?バグの場合は、修正を待つことができます。千人が問題なくやったはずの基本的なことのように思えるので、どういうわけか正しく設定されていない気がします。ご入力いただきありがとうございます。

17
d370urn3ur

私はあなたが観察しているのとまったく同じ問題に遭遇したことを覚えています。あなたが試すことができるいくつかの解決策があるかもしれません。

  • ストーリーボードを使用している場合テーブルビュー用に設定したViewControllerまたはTableViewControllerをクリックし、その属性インスペクターに移動して、ViewControllerセクションを確認し、ExtendEdgesセクションを下に設定する必要があります。トップバー。

  • ストーリーボードを使用していない場合 viewcontrollersのedgesForExtendedLayoutプロパティを使用して手動で設定を設定でき、それでうまくいくはずです。絵コンテを使っていました。

29
hackamanshu

私の場合、ストーリーボードを使用して、上部のバーの下不透明なバーの下の両方をチェックし、下部のバーの下をオフのままにする必要がありました。

17
Gerhat

私の場合、検索バーがそれ自体をオフセットしないようにするために、ストーリーボードのすべての拡張エッジボックス(基本的にはプログラムで拡張エッジをUIRectEdgeNoneに設定するのと同じ)をオフにする必要がありました。君たちありがとう!

3
Danchez

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は、アクティブなときにアニメーションが大きすぎます

2
Gleb

私の問題はただスクロールビューの挿入を調整するでした。 falseに変更した後、問題はありませんでした

2

私は非常によく似た行動をしました。私にとっての解決策は、親ビューコントローラーのストーリーボード設定で[トップバーの下のエッジを拡張]のチェックを外すことでした(透明なナビゲーションバーをオフにしましたが、それが何かに影響するかどうかはわかりません)。ストーリーボードを使用していない場合は、[UIViewControlleredgesForExtendedLayout]を設定する必要があります。

Appleドキュメントから:

このプロパティは、UINavigationControllerやUITabBarControllerなどのコンテナに埋め込まれているビューコントローラにのみ適用されます。ルートビューコントローラーとして設定されたビューコントローラーは、このプロパティに反応しません。デフォルト値はUIRectEdgeAllです。

1
Alex Sharp

私も同じ問題を抱えていました。そして、テーブルビューの下にビューオブジェクトを追加することで、この問題を解決します。

  1. ストーリーボードに新しいViewControllerを追加します
  2. TableViewを新しいVCにドラッグします
  3. テーブルセルをTableViewにドラッグします
  4. TableView DataSource、TableViewデリゲートの新しいVCへの接続を作成します
1
dakeshi
  1. ストーリーボードに移動します。
  2. ビューコントローラをクリックします。
  3. ViewControllerセクションの下の属性インスペクターに移動します。
  4. [エッジの拡張]セクションを[トップバーの下]と[不透明バーの下]に設定します。
  5. ボトムバーの下のチェックを外してください。
0

残念ながら、上記の解決策はどれもうまくいきませんでした。私は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);
    }
}
0
KVISH