web-dev-qa-db-ja.com

UISearchBarがアクティブな場合、UITableViewコンテンツがステータスバーと重なる

UISearchBarとUISearchDisplayControllerを備えたUITableViewControllerがあります。これは、UINavigationControllerにあるUIViewControllerのコンテナビュー内に存在します。構造を説明するためにこの画像を作成しました:

enter image description here

これは実際には次のようになります。

enter image description here

検索バーをタップすると、ナビゲーションバーを非表示にする必要があります。通常、これはそれ自体で発生しますが、私のUITableViewControllerはコンテナービュー内にあるため、その変更を自分で処理する必要があります。現時点では非表示になっていますが、ナビゲーションバーが白であるため、ステータスバーは白であることに注意してください。

enter image description here

検索テキストを入力し始めると、結果が表示されます。これらの結果を上にスクロールすると、検索バーの下を通過しますが、ステータスバーと重なるため、非常に魅力的ではありません。

enter image description here

Container Viewが関係していない場合、これはすべて意図したとおりに機能し、テーブルのコンテンツはステータスバーの下を通過しますが、ContainerViewが関係していると、テーブルテキストとステータスバーが衝突します。

通常のようにテキストをステータスバーの下で移動するにはどうすればよいですか?

31
Kenny Wyland

私はこれを何時間も検索しましたが、私の最終結果はこの行をviewDidLoadに入れることでした:self.extendedLayoutIncludesOpaqueBars = YES;

問題が解決しました :)

36
nonolays

definesPresentationContextviewDidLoadTableViewControllerを設定してみてください

Swift

override func viewDidLoad() {
    super.viewDidLoad()

    definesPresentationContext = true
}

Objective-C

- (void)viewDidLoad {
    [super viewDidLoad];

    self.definesPresentationContext = YES;
}
5
warly

これが私のために働いたものです:

行う:

  • UISearchControllerを使用します(個別に配置されたUISearchBarではありません)
  • VCがまだない場合はUINavigationControllerに配置します。必要に応じて、ナビゲーションを「ナビゲーションバーを表示する」に設定しないでください。
  • UITableView(スプリングやストラットではない)にautolayoutを使用して、テーブルの上部をVCのビューの上部に固定します。
  • このデリゲートメソッドを追加します。

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; }

してはいけないこと:

  • エッジのあるフィドルForExtendedLayout
  • ExtendedLayoutIncludesOpaqueBarsのフィドル
  • テーブルのcontentInsetをいじる
4
John Scalo

UISearchBarとUISearchDisplayControllerがあります。

Viewdidloadの場合:

self.edgesForExtendedLayout = UIRectEdgeNone;
[searchDisplayController.searchBar setBackgroundImage:[self imageWithColor:ETSBaseColor] forBarPosition:0 barMetrics:UIBarMetricsDefault];

uIColorから画像を取得するメソッド:

- (UIImage *)imageWithColor:(UIColor *)color
{
    CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}
3
Marlon Ruiz

基本的に、これはナビゲーションバーの透過性によるものです。通常、ビューコントローラーは、UIScrollViewから(または継承して)所有しているビューまたはサブビューの上部インセットを修正することにより、重複を修正します。 2つのオプションがあります。1つはnavbarの透過性をnoに設定すること、もう1つはedgeForExtendedLayoutをnoneに設定するか、底のみを残すことです。

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
    self.navigationController.navigationBar.translucent = YES;
}

- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
    self.navigationController.navigationBar.translucent = NO;
}

これらのアドバイスはiOS7でのみ機能します。これらのプロパティを設定する前に、より低いターゲットチェックに展開する場合です。
別の方法ですが、テストしていませんが、--topLayoutGuide長さと-searchDisplayControllerWillBeginSearchで同じ長さのtopInsetsを設定してみてください。この方法でも、半透明性を維持する必要があります。

2
Andrea

私は同じ問題を抱えていました:

- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
{
    controller.searchBar.searchBarStyle = UISearchBarStyleDefault; // Used to cover UIStatusBar
}

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
    controller.searchBar.searchBarStyle = UISearchBarStyleMinimal; // Used not to show top and bottom separator lines
}
0
B.S.

次のハックは私のために働きました:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return (self.searchController.isActive  && section == 0) ? 22.0f : 0.0f;
}
0
CGN

私の場合、UINavigationBarを非表示にしたくありませんが、ギャップやその他の副作用に関して同様の問題がありました。それらの1つは、UISearchDisplayControllerが表示されているときにUIViewControllersを切り替えた後、UISearchBarが欠落していたことです(私はSWRevealViewControllerを使用してUIViewControllerを切り替えています)。この問題はiPadでのみ発生します。 UISearchBarが突然UINavigationBarの後ろに隠れていることがわかりました。これで、UIContainerViewに表示されるUITableViewControllerの次のコード行ですべての問題を解決しました。

- (UINavigationController *)navigationController {
    return nil;
}

これらの行により、UISearchDisplayControllerがUINavigationControllerに到達して変更できなくなります。また、このメソッドを「MyContainerTableViewController」クラスにサブクラス化し、すべての埋め込みUITableViewControllerにこのクラスを使用します。

まだiOS 7をサポートするためにUISearchDisplayControllerを使用しています。

0
Raimund Wege