web-dev-qa-db-ja.com

iOS 7-ステータスバーがビューに重なっています

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

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

Enter image description here

View controller-based status bar appearanceNOに設定しようとしましたが、問題は修正されませんでした。

109
aryaxt

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

enter image description here

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

95
aryaxt

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

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

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

69
Nathan H

これはiOS 7のUIViewControllerのデフォルトの動作です。ビューはフルスクリーンになり、ステータスバーがビューの上部に表示されます。

UIViewController内にUINavigationControllerがあり、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;
}
43
Vincent

自分で作った唯一の実用的なソリューション

ここに私の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];
}
15
comonitos
-(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にキーを追加---コントローラーベースのステータスバーの外観を表示:いいえ

13
Darshit Shah

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

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

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

キーが存在しない場合は、上部の「information property list」を選択し、+アイコンをクリックして追加できます

4
Mandeep Pasbola

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

xib heirarchy

そして、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
tipycalFlow

ステータスバーを削除するために必要なのはこれだけです。 enter image description here

3
Tony

完全に隠したいだけで対処したくない場合は、これでうまくいきます。

-(BOOL) prefersStatusBarHidden
{
    return YES;
}

参照 https://stackoverflow.com/a/18873777/1030449

3
Kalel Wade

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

このコードを書く:

self.navigationController.navigationBar.translucent = NO;

ちょうど私のためにトリックをしました。

2
CoderSaru

ビンセントの答えedgesForExtendedLayoutは私のために働いた。

これらのマクロは、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
}

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

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を持っているときに機能します。

1
Liangjun

「自動レイアウトを使用」を任意のコストで有効にする場合は、viewdidloadに次のコードを配置します。

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

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:
    }
}
0
John Pang