web-dev-qa-db-ja.com

UISearchBarがiOSのステータスバーと重なっている

私は(ここにいる他のみんなと同じように)他のみんなと同じステータスバーのオーバーラップの問題に少しひねりを加えて遭遇しています。そのため、これについて新しい質問を開きます。

UISearchBarに自分自身を配置する場所を知らせるメカニズムがあるようです。これは完全に強打から外れています。

jaredsinclairの回答はこちら( iOS7ステータスバーはiPhoneアプリのiOS6デフォルトスタイルに戻りますか? )、Appleエンジニアがロジックを導入する方法を詳細に説明していますユーザーの環境に可能な限り溶け込むためのアプリケーション。

アプリケーション内の各UIViewControllerを注意深く調べ、わずかな変更を可能にするプロセスを実行しました。

ほとんどの場合、私はいくつかのSO回答で見つけた以下のコードを使用して問題を解決することができました

// Do any additional setup after loading the view.
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]){
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

ただし、これは、UINavigationBarが非表示になっている特定のビューで何をしても機能しません。

UISearchBar on top of status bar

SOで見つかったソリューションに基づいて、この特定のUIViewControllerに次のロジックを追加することで、この問題を解決できました。

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    CGRect statusBarFrame =  [[UIApplication sharedApplication] statusBarFrame];
    viewFrame.Origin.y = viewFrame.Origin.y+statusBarFrame.size.height;
}

これにより、ステータスバーの高さに応じてUIViewControllernピクセルが「下に」押し下げられます。

これの効果はここに示されています

Hacked position UISearchBar

問題は、検索フィールドに入ると、UISearchBarがそれ自体で上部に20pxのパディングを追加し、UI全体をオフセットすることです。

enter image description here

これにより、UISearchBarはそれ自体を調整しようとし、偶然にもステータスバーの高さとまったく同じ量を調整しようとするという結論に至ります。

位置をハックしない場合、検索フィールドに入力すると、この自動調整によりUISearchBarがステータスバーの下にきちんと配置されます。

私の混乱を詳しく説明したことを願っています。誰かが解決策について何かアイデアを持っているかどうか疑問に思っています。

18

ナビゲーションバーが表示されている場合は、ViewDidLoadで次の手順を実行します。

self.edgesForExtendedLayout = UIRectEdgeNone;

ナビゲーションバーが非表示になっている場合は、ViewDidLoadで次の手順を実行します。

すべてのUIView要素を20ポイントシフトして調整します

27
Sunil Adhyaru

UISearchBarには、必要なもののデリゲートメソッドがあります。上から20px配置するだけです。

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

残念ながら、UISearchDisplayControllerとは連携しません。

4
DanielFo

この問題にも苦労しました。これをViewControllersのviewDidLoadメソッドに入れる必要があります。

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

これで修正されるはずです。 iOS7移行ガイドにも記載されています。 https://developer.Apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html#//Apple_ref/doc/uid/TP40013174-CH15-SW1

4
Ben Lime

制約を追加する代わりに、AutoLayoutを介してこの問題を解決したい場合は、searchBar.top = self.view.top次のように、topLayoutGuideに制約を追加します。

searchBar.top = topLayoutGuide.bottom
2
rounak

私はまったく同じ問題を抱えており、@ Benや ここ のような提案に基づいて、次のコードを追加することになりました。

- (void) viewDidLayoutSubviews

    {
        if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
        {
            CGRect viewBounds = self.view.bounds;
            CGFloat topBarOffset = self.topLayoutGuide.length;
            viewBounds.Origin.y = topBarOffset * -1;
            self.view.bounds = viewBounds;

            self.edgesForExtendedLayout = UIRectEdgeNone;
        }
    }

あるいは、このコードも機能します

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {

        self.automaticallyAdjustsScrollViewInsets=YES;
        self.edgesForExtendedLayout = UIRectEdgeNone;
        self.navigationController.view.backgroundColor = [UIColor whiteColor];
        self.navigationController.navigationBar.translucent = YES;
    }
2
malkoty

検索バーがそれ自体の高さを調整することについては少しはっきりしていません-私の検索バーはそれをしませんか?だが。

検索バーの制約をIBのトップレイアウトガイドに追加できます。これにより、iOS6とiOS7の両方でステータスバーの下部に貼り付けられます。その後、ステータスバーの高さを手動で調整するコードを削除した場合。それはそれの世話をする必要があります。これを行う方法の例をここで見ることができます: https://developer.Apple.com/library/ios/qa/qa1797/_index.html

0
BreadicalMD