iOS 7-ステータスバーがビューと重なる


109

の中にあるViewControllerがありますUINavigationcontrollerが、navigationBarは非表示になっています。iOS 7でアプリを実行すると、ステータスバーがビューの上に表示されます。これを回避する方法はありますか?

OS固有のコードを書きたくありません。

ここに画像の説明を入力してください

に設定View controller-based status bar appearanceしてみましたNOが、問題は解決しませんでした。


私は、iOS 7でのiOS 6のようなステータスバーを表示するように私の答えを掲載しているstackoverflow.com/questions/18294872/...
デザートローズ

2
ステータスバーの問題を処理するには、yの原点とデルタの値も調整する必要があります。これは、 stackoverflow.com
q /

回答:


95

Xcode 5は、iOS 6/7 Deltasこの問題を解決するために特別に作成されています。ストーリーボードで、ビューを20ピクセル下に移動してiOS 7で正しく見えるようにし、iOS 6と互換性を持たせるために、Delta y-20 に変更しました。

ここに画像の説明を入力してください

私のストーリーボードは自動レイアウトを使用していないため、iOS 6でビューの高さを適切にサイズ変更するには、Delta heightと同様に設定する必要がありましたDelta Y


8
正解ですが、4インチディスプレイでは動作しません。4インチディスプレイでも動作するようにできる場合は、回答を更新してください。前もって感謝します。

2
@AnkitMehta私は4インチのiphoneに特定のことをする必要はありませんでした
aryaxt

5
私のために働いた。この差分を表示するには、ストーリーボードの[Identity and Type]で[Use Autolayout]の選択を解除する必要があることに注意してください。
マルサント2013年

2
ΔYに-20を設定することに加えて、ΔHeightに+20を設定する必要があることもわかりました
Toland Hon

3
ステータスバーの高さが変わるとどうなりますか?F.ex .:ユーザーがホットスポットなどをアクティブにしたとき...高さは40pxです...
Lukasz

69

ステータスバーがまったく不要な場合は、このデータでplistを更新する必要があります。これを行うには、plistで次の2つの設定を追加します。

<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>

iOS 7では、オーバーレイされた透明なステータスバーを念頭に置いてアプリを設計する必要があります。たとえば、新しいiOS 7 Weatherアプリをご覧ください。


3
これは、本来の方法で問題をコアで修正するため、実際にはこれが唯一の良い答えです。だから:賛成票が必要です!
eleven59 2013年

5
状況によっては適切な場合もありますが、ステータスバーを非表示にするには、細心の注意が必要です。メディアプレーヤーや画像ビューアなど、正当に全画面表示されるビューのみ。
smileBot 2013年

1
@ eleven59、あなたはアップルの独裁者が意図する方法を意味します。
JohnK 2013年

1
これは間違いなく、ビューコントローラーのオフセットを変更するよりも優れています(本当に汚れているように感じます)。
ベンジャミンオマーン

ステータスバーを非表示にするのは良い考えではありません...これはiOS 7を処理する最も簡単な方法ですが、タイミングが必要です...
Fahim Parkar 2013年

43

これはUIViewControlleriOS 7のデフォルトの動作です。ビューは全画面表示になります。つまり、ステータスバーがビューの上部を覆います。

あなたが持っている場合はUIViewControllerUINavigationControllerとnavigationBarが表示されている、あなたは、次のコードを持つことができるviewDidLoadかnavigationBarはトリックを行うための背景画像を持っています。

self.edgesForExtendedLayout = UIRectEdgeNone;

navigationBarを非表示にしている場合は、20ポイントをシフトしてすべてのUIView要素を調整する必要があります。他の解決策はありません。自動レイアウトを使用すると少し役立ちます。

下位互換性が必要な場合に、iOSバージョンを検出するためのサンプルコードを次に示します。

NSUInteger DeviceSystemMajorVersion() {
    static NSUInteger _deviceSystemMajorVersion = -1;
    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{
        NSString *systemVersion = [UIDevice currentDevice].systemVersion;
        _deviceSystemMajorVersion = [[systemVersion componentsSeparatedByString:@"."][0] intValue];
    });

   return _deviceSystemMajorVersion;
}

18
システムバージョンを取得、解析、比較する代わりに、if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
セバスチャンホジャス

15

私が自分で作った唯一の実用的な解決策。

ここに私のUIViewControllerサブクラスがありますhttps://github.com/comonitos/ios7_overlaping

1 UIViewControllerのサブクラス

2そのクラスからwindow.rootViewControllerをサブクラス化します。

3出来上がり!

- (void) viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect screen = [[UIScreen mainScreen] bounds];
        if (self.navigationController) {
            CGRect frame = self.navigationController.view.frame;
            frame.origin.y = 20;
            frame.size.height = screen.size.height - 20;
            self.navigationController.view.frame = frame;
        } else {
            if ([self respondsToSelector: @selector(containerView)]) {
                UIView *containerView = (UIView *)[self performSelector: @selector(containerView)];

                CGRect frame = containerView.frame;
                frame.origin.y = 20;
                frame.size.height = screen.size.height - 20;
                containerView.frame = frame;
            } else {
                CGRect frame = self.view.frame;
                frame.origin.y = 20;
                frame.size.height = screen.size.height - 20;
                self.view.frame = frame;
            }
        }
    }
}

4これを追加して、ステータスバーを白くします[self.window makeKeyAndVisible]の直後に; !!!

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}

しかし、これは時間を上に表示していない...最大の欠点... :(
Fahim Parkar '20

うまく機能しますが、ステップ4では、setStatusBarStyleは非推奨であり、デフォルトのアクションは何もしないことなので、ビューコントローラーでpreferredStatusBarStyleを使用する必要があります。stackoverflow.com/a/19014724/1192732
CpnCrunch

13
-(UIStatusBarStyle)preferredStatusBarStyle
{
    return UIStatusBarStyleLightContent;
}

-(void)viewWillLayoutSubviews{

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
  {
    self.view.clipsToBounds = YES;
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenHeight = 0.0;
    if(UIDeviceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
        screenHeight = screenRect.size.height;
    else
        screenHeight = screenRect.size.width;
    CGRect screenFrame = CGRectMake(0, 20, self.view.frame.size.width,screenHeight-20);
    CGRect viewFrame1 = [self.view convertRect:self.view.frame toView:nil];
    if (!CGRectEqualToRect(screenFrame, viewFrame1))
    {
        self.view.frame = screenFrame;
        self.view.bounds = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    }
  }
}

キーをplistに追加---コントローラベースのステータスバーの外観を表示:いいえ


必要に応じてウィンドウの色を変更する
Darshit Shah

おかげで、それは私の重複する問題を解決しました。しかし、まだ問題が1つあります-コントローラベースのステータスバーの外観の表示:いいえ、ステータスバーを非表示にすることです。しかし、それをYESに設定するとステータスバーが表示されず、NOに設定するとステータスバーが表示されます。だから私はコンセプトや何が間違っているのか教えてください
Nayan 2014年

1
didFinishLaunchingWithOptions 'self.window.backgroundColor = [UIColor blueColor];'に設定されているデフォルトの半透明色を使用しているので、plistで設定しますビューコントローラベースのステータスバーの外観YES
Darshit Shah

よかった、ありがとう!また、アップルのドキュメントがif(NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_6_1){} else {}で確認する場合に推奨されることを指摘するだけです。乾杯!
Joel Balmer

あなたのコードは私たちにとってとても役に立ちます。viewWillLayoutSubviews関数について説明する必要があります。
user3182143 2016

4

ios7でステータスバーを非表示にするには、次の簡単な手順に従います。

Xcodeで「Resources」フォルダに移動し、「(app name)-Info.plist file」を開きます。

  • View controller based status bar appearance」キーをチェックし、その値を設定します「NO
  • Status bar is initially hidden」キーをチェックし、その値を設定します「YES

キーがそこにない場合はinformation property list、上部にある「」を選択し、+アイコンをクリックして追加できます。


質問を明確に読んでください、彼はステータスバーを完全に隠すことを求めませんでした。
ShayanK 2014年

1
@AspersionCast:「これを回避する方法はありますか?」これはそれを回避する方法の1つです。
Mandeep Pasbola、2014年


3

xibs を使用する場合、非常に簡単な実装は、ビューの階層が次のようになるように、サイズ変更フラグ(既に3.5インチと4インチの互換性のために使用している)を含むコンテナービュー内のすべてのサブビューをカプセル化することです。

xib階層

viewDidLoad、次のようにします。

- (void)viewDidLoad
{
  [super viewDidLoad];
  // initializations
  if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) // only for iOS 7 and above
  {
    CGRect frame = containerView.frame;
    frame.origin.y += 20;
    frame.size.height -= 20;
    containerView.frame = frame;
  }
}

この方法では、iOS 7との互換性のためにペン先を変更する必要はありません。背景がある場合は、外側に置いてcontainerView画面全体を覆うようにすることができます。


3

これは、ステータスバーを削除するために必要なすべてです。 ここに画像の説明を入力してください


2

ナビゲーションバーの場合:

このコードを書く:

self.navigationController.navigationBar.translucent = NO;

ちょうど私のためにトリックをやった。


1

ヴィンセントの答えedgeForExtendedLayoutは私のために働いた。

これらのマクロは、OSのバージョンを判別しやすくするのに役立ちます

// 7.0 and above 
#define IS_DEVICE_RUNNING_IOS_7_AND_ABOVE() ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) 

// 6.0, 6.0.x, 6.1, 6.1.x
#define IS_DEVICE_RUNNING_IOS_6_OR_BELOW() ([[[UIDevice currentDevice] systemVersion] compare:@"6.2" options:NSNumericSearch] != NSOrderedDescending) 

これらのマクロをプロジェクトのprefix.pchファイルに追加すると、どこからでもアクセスできます

if(IS_DEVICE_RUNNING_IOS_7_AND_ABOVE())
{
 //some iOS 7 stuff
 self.edgesForExtendedLayout = UIRectEdgeNone;
}

if(IS_DEVICE_RUNNING_IOS_6_OR_BELOW())
{
 // some old iOS stuff
}

1
私にとっては、self.edgesForExtendedLayout = UIRectEdgeNone; 動作していません...理由は何ですか?
Fahim Parkar 2013年

1

私はこれと同じ質問で別の投稿に私の回答を投稿しました。

Apple iOS7移行ガイドから、https: //developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1

具体的にautomaticallyAdjustsScrollViewInsets=YESset self.edgesForExtendedLayout = UIRectEdgeNone私が重複したくないと私は持っていたときに私の作品tableviewcontroller


0

「自動レイアウトを使用」を有効にしたい場合は、次のコードをviewdidloadに配置してください。

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) 
{
        self.edgesForExtendedLayout = UIRectEdgeNone;
        self.extendedLayoutIncludesOpaqueBars = NO;
        self.automaticallyAdjustsScrollViewInsets = NO;
}

0

YTPlayerの横向きビューから戻った後、ステータスバーとナビゲーションバーが重なります。@comonitosのバージョンを試した後の私の解決策は次のとおりですが、iOS 8では機能しません

- (void)fixNavigationBarPosition {
    if (self.navigationController) {
        CGRect frame = self.navigationController.navigationBar.frame;
        if (frame.origin.y != 20.f) {
            frame.origin.y = 20.f;
            self.navigationController.navigationBar.frame = frame;
        }
    }
}

ナビゲーションバーの位置を固定したいときはいつでも、この関数を呼び出してください。YTPlayerViewDelegateを呼び出しましたplayerView:didChangeToState:

- (void)playerView:(YTPlayerView *)playerView didChangeToState:(YTPlayerState)state {
    switch (state) {
        case kYTPlayerStatePaused:
        case kYTPlayerStateEnded:
            [self fixNavigationBarPosition];
            break;
        default:
    }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.