web-dev-qa-db-ja.com

IOS7のステータスバーとナビゲーションバーの問題

アプリケーションをiOS 7に移行しています。ステータスバーの問題を処理するために、このコードを追加しました。

if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f)
{
    CGRect frame = self.navigationController.view.frame;
    if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        frame.Origin.y = 20;
    }
    else
    {
        frame.Origin.x = 20;
    }
    [self.navigationController.view setFrame:frame];
}

これは通常の場合は正常に機能しています。向きを変更する(アプリが横向きのみをサポートする)か、View Controllerを表示してModel View Controllerを閉じると、View Controllerの配置が変更されます。ステータスバーは再びView Controllerと重なります。このコードはまったく機能していません。このステータスバーの問題を解決するために私を案内してください。

ケース2:これは、View Controllerを提示する方法です

ZBarReaderViewController *reader = [ZBarReaderViewController new];
reader.readerDelegate = self;

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    reader.supportedOrientationsMask = ZBarOrientationMaskLandscape;
else
    reader.supportedOrientationsMask = ZBarOrientationMaskPortrait;

    [self presentModalViewController:reader animated:YES];

参照:

enter image description here

前もって感謝します。

57
Ganapathy

IOS 7のステータスバーの問題を修正

最後に、xcode5のデルタ値プロパティを使用して、ラップオーバーのステータスバーの問題を修正しました。まず、Xibで使用されるすべてのコントローラーにOrigin-y 20pxlを増やしました(IOS 7でのみ正常に動作するようにシームします)、その後i setすべてのビューコントローラOriginのデルタ値-yから-20は、ios 6とIOS 7の両方で正常に動作します。

それを行う手順。

Xcode 5は、OSバージョンに基づいて異なるビューでxibの外観を表示するプレビューオプションを提供します。

アシスタントエディターからプレビューオプションを選択します

アシスタントエディターをクリック

enter image description here

プレビューオプションを選択して、選択したView Controllerを異なるバージョンでプレビューします。 enter image description here

ビューコントローラービュープレビューオプション。

enter image description here

プレビューでは、異なるバージョンでビューをプレビューするためのトグルオプションを見つけることができます。プレビューでは、バージョンを切り替えることで適切に修正されない場合、ステータスバーの問題を明確に感じることができます。

ステータスバーの問題を修正するための3つのステップ:ステップ1:ファイルインスペクターで7.0以降をターゲットとして表示を確認します。 enter image description here

手順2:Originを増やします-yは20ピクセル(正確にステータスバーのサイズ)、View Controllerに追加されたすべてのコントロールに対して。

ステップ3:すべてのコントロールに対してOrigin yのデルタ値を-20に設定しますその後、バージョンに基づいて自動的に調整されます。今すぐプレビューを使用し、デルタ値のためにコントロールが自動的に調整する違いを感じてください。 enter image description here

ステータスバーの問題が修正されると、モデルビュー(ZbarSDkコントローラー)の表示中の問題も自動的に修正されます。

プレビュー画面:

enter image description here

132
Ganapathy

私はこの回答に遅れていますが、私がやったことを共有したいだけです
最も簡単な解決策

最初 of-> info.plist Fileに移動し、ステータスバースタイルを追加->透明な黒スタイル(0.5のアルファ)

今、ここに行く:-

AppDelegate.mにこのコードを追加

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
     //Whatever your code goes here
  if(kDeviceiPad){

     //adding status bar for IOS7 ipad
         if (IS_IOS7) {
              UIView *addStatusBar = [[UIView alloc] init];
              addStatusBar.frame = CGRectMake(0, 0, 1024, 20);
              addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //change this to match your navigation bar
              [self.window.rootViewController.view addSubview:addStatusBar];
                    }
                }
    else{

         //adding status bar for IOS7 iphone
        if (IS_IOS7) {
            UIView *addStatusBar = [[UIView alloc] init];
            addStatusBar.frame = CGRectMake(0, 0, 320, 20);
            addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //You can give your own color pattern
            [self.window.rootViewController.view addSubview:addStatusBar];
        }

    return YES;
   }
15
Vizllx
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease];

    self.window.rootViewController = self.viewController;

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

        [application setStatusBarStyle:UIStatusBarStyleLightContent];
         [application setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];

        self.window.clipsToBounds =YES;            
        self.window.frame =CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20);
    }


   [self.window makeKeyAndVisible];
    return YES;
}

info.plistに以下を設定します

コントローラーベースのステータスバーの外観を表示= NO;

6
John

一度にすべてのビューに対してこれを行うことができます

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
// Notification for the orientaiton change
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(applicationDidChangeStatusBarOrientation:)
                                             name:UIApplicationDidChangeStatusBarOrientationNotification
                                           object:nil];

// Window framing changes condition for iOS7 or greater
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, -20, self.window.frame.size.width, 20)];//statusBarBackgroundView is normal uiview
    statusBarBackgroundView.backgroundColor = [UIColor colorWithWhite:0.000 alpha:0.730];
    [self.window addSubview:statusBarBackgroundView];
    self.window.bounds = CGRectMake(0, -20, self.window.frame.size.width, self.window.frame.size.height);
}
// Window framing changes condition for iOS7 or greater

self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];


return YES;
}

そして、オリエンテーションを使用している間に、アプリデリゲートに以下のメソッドを追加して、オリエンテーションを介して設定することができます。

- (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification
{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    statusBarBackgroundView.hidden = YES;
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    int width = [[UIScreen mainScreen] bounds].size.width;
    int height = [[UIScreen mainScreen] bounds].size.height;

    switch (orientation) {
        case UIInterfaceOrientationLandscapeLeft:
            self.window.bounds =  CGRectMake(-20,0,width,height);
            statusBarBackgroundView.frame = CGRectMake(-20, 0, 20, height);
            break;
        case UIInterfaceOrientationLandscapeRight:
            self.window.bounds =  CGRectMake(20,0,width,height);
            statusBarBackgroundView.frame = CGRectMake(320, 0, 20, height);
            break;
        case UIInterfaceOrientationPortraitUpsideDown:
            statusBarBackgroundView.frame = CGRectMake(0, 568, width, 20);
            self.window.bounds =  CGRectMake(0, 20, width, height);
            break;
        default:
            statusBarBackgroundView.frame = CGRectMake(0, -20, width, 20);
            self.window.bounds =  CGRectMake(0, -20, width, height);
            break;
    }
    statusBarBackgroundView.hidden = NO;
}
}

以下のNavigation Controllerカテゴリを追加する必要があります

.h

#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
@interface UINavigationController (iOS6fix)

@end

.m

#import "UINavigationController+iOS6fix.h"
@implementation UINavigationController (iOS6fix)  

-(BOOL)shouldAutorotate
{
      return [[self.viewControllers lastObject] shouldAutorotate];
}

-(NSUInteger)supportedInterfaceOrientations
{
      return [[self.viewControllers lastObject] supportedInterfaceOrientations];
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
     return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation];
}

@end
3
sinh99

MUCH MUCH MUCHより簡単な答え:

ビューの上部を「上部のレイアウトガイド」に合わせますが、「上部のレイアウトガイド」をビューに合わせてドラッグし、「垂直」制約を設定します。 この回答を参照 画像参照について。

仕組みは-「トップレイアウトガイド」はステータスバーがある場合とない場合に自動的に調整され、すべて機能します-コーディングは不要です!

追伸この特定の例では、ビューの下部の適切な垂直方向の制約、スーパービューなどに設定して、下部に透けて見える背景も解決する必要があります...

3
Brad

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

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

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

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

3
Mandeep Pasbola

私は以下のコードを使用してこれを解決しました

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 {
    if(landScape mode)

       if ([UIDevice currentDevice].systemVersion.floatValue>=7) {
        CGRect frame = self.window.frame;
       frame.size.width -= 20.0f;
      frame.Origin.x+= 20.0f;
       self.window.frame = frame;
    }


 if(portrait)

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

    CGRect frame = self.window.frame;
    frame.Origin.y += 20.0f;
    frame.size.height -= 20.0f;
    self.window.frame = frame;
}
return YES;

 }
1
user2230971
#define _kisiOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

 if (_kisiOS7)
    {
        [[UINavigationBar appearance] setBarTintColor:_kColorFromHEX(@"#011C47")];
    }
    else
    {
        [[UINavigationBar appearance] setBackgroundColor:_kColorFromHEX(@"#011C47")];
        [[UINavigationBar appearance] setTintColor:_kColorFromHEX(@"#011C47")];
    }
1
Mubin Shaikh

viewWillAppearに次のコードを設定するだけです。

 if ([[[UIDevice currentDevice] systemVersion] floatValue]<= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
 }
1

Salesforce SDK 2.1(Cordova 2.3.0)では、アプリの初期読み込み時にステータスバーを表示し、バックグラウンド(iPhoneおよびiPad)から復帰させるために、以下を行う必要がありました。

ここに投稿された他のソリューションとは対照的に、これはデバイスの回転に耐えられるようです。

1 -theSFHybridViewControllerのカテゴリを作成

#import "SFHybridViewController+Amalto.h"

@implementation SFHybridViewController (Amalto)

- (void)viewWillAppear:(BOOL)animated
    {
        //Lower screen 20px on ios 7
        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
            CGRect viewBounds = self.view.bounds;
            viewBounds.Origin.y = 20;
            viewBounds.size.height = viewBounds.size.height - 20;
            self.webView.frame = viewBounds;
        }

    [super viewWillAppear:animated];
    }

    - (void)viewDidLoad
    {

        if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
            CGRect viewBounds = self.view.bounds;
            viewBounds.Origin.y = 20;
            viewBounds.size.height = viewBounds.size.height - 20;
            self.webView.frame = viewBounds;
        }
        [super viewDidLoad];
    }

@end

2 -AppDelegate.mインポートに追加

#import "SFHybridViewController+Amalto.h"

3 -メソッドの最後に挿入didFinishLaunchingWithOptions of AppDelegate

//Make the status bar appear
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {

    [application setStatusBarStyle:UIStatusBarStyleLightContent];
    [application setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade];
}

4 -App-Info.plistプロパティに追加

View controller-based status bar appearanceNO

0
Bruno Grieder

いくつかの異なる方法があります。 1つの方法は、.plistファイルを使用することです

  • 新しいキー「View Controllerベースのステータスバーの外観」を追加し、値を「NO」に設定します。
  • 別のキー「ステータスバーは最初は非表示」を追加し、値を「YES」に設定します。

これにより、プロジェクト全体でステータスバーが非表示になります。

Screenshot for approach

0