web-dev-qa-db-ja.com

iOS 7ステータスバーがNavigationBarと衝突する

アプリには、ストーリーボードでナビゲーションバーがドラッグされたView Controllerがあります。 iOS 6では正常に機能していましたが、iOS 7では次のようになります。

ios 7 status bar nav var

ステータスバーとナビゲーションバーが互いに衝突しないようにします。スタックオーバーフローに関するこのような質問をたくさん見ましたが、それらは私にはあまり役に立ちませんでした。

いくつかの質問は、「self.edgesForExtendedLayout = UIRectEdgeNone;」を使用する必要があると言っています。しかし、うまくいきませんでした。ナビゲーションバーを削除して、プログラムの実装方法のために実行できないNavigation Controller内に埋め込む必要があると言う人もいます。一部のソリューションでは、ビューの境界とすべてを使用することを提案していますが、それでもうまくいきませんでした。

この問題を解決するのに役立つ1つのことは何ですか。前もって感謝します!

PDATE:ビューコントローラーをuinavigationコントローラー内に埋め込みました。以前に手動で追加されたナビゲーションバーを削除しました。ストーリーボードでは正常に見えますが、実行すると次のように表示されます。

iOS 7 Navigation Status bar

現在、その背後にある別のView Controller、つまりその親View Controllerからのテキストを表示しています。透明になりました。誰かが私が間違っていることを指摘できますか?

47
AJ112

IOSの最新バージョンは多くの視覚的な変更をもたらし、開発者の観点から見ると、ナビゲーションとステータスバーは2つの顕著な変更です。

ステータスバーが透明になり、その後ろのナビゲーションバーが透けて見えます。ナビゲーションバーの画像は、ステータスバーの背後に拡張することもできます。

まず、初心者でiOS開発を始めたばかりで、ステータスバーとナビゲーションバーの動作が混乱している場合は、 [〜#〜]こちら[〜 #〜] とても便利だと思いました。 iOS 7のナビゲーションとステータスバーに関連するすべての情報が含まれています。

今、あなたの質問の答えに来ています。まず第一に、2つの異なる問題を見ることができます。 1つは、質問で画像に示されているように、ステータスバーとナビゲーションバーの両方が互いに衝突しているということです。

問題:まあ問題は、iOS 6で正しく機能していたがiOS 7の到来とともに、View Controllerのナビゲーションバーを以前にドラッグしたことですSDKでは、このアプローチにより、ステータスバーとナビゲーションバーが互いに重複します。

最初の問題の解決策:UIBarPositionTopAttachedを使用するか、ビューの境界とフレームを使用することができます。 Appleのドキュメント およびbla bla blaですが、問題を解決するにはしばらく時間がかかります。

この問題を解決するための最良かつ最も簡単な方法は、View ControllerをNavigation Controller内に埋め込むことです。それには、View Controllerを選択して、[エディタ]> [埋め込み]> [Navigation Controller]を選択します。 (古いNavigation Barにコンテンツがある場合、まずコンテンツを下にドラッグし、View ControllerをNavigation Controllerに埋め込み、次に新しいNavigation Barのバーボタンを移動してから古いNavigation Barを削除します)

2番目の問題の解決策:この解決策は、アップデートで言及した特定の質問に対するものであり、これを読んでいる一般の人々に対するものではありません。ご覧のとおり、Navigation and Status Barは表示されず、透明な領域に親View Controllerが表示されています。この問題に直面している理由を実際に使用していませんが、おそらくECSlidingViewなどのサードパーティライブラリが関係しているためです。ストーリーボードでこのView Controllerを選択し、ビューの背景色をナビゲーションバーと同じに設定できます。これにより、背後の親View Controllerの表示が停止し、ナビゲーションバーとステータスバーの表示が開始されます。これで、View Controllerの残りの部分をテキストビューでカバーすることができます。

お役に立てれば!

66
KC.

IOS 7以降、ステータスバーはView Controllerのビュー全体に重なっているため、ナビゲーションバーはステータスバーに近すぎます。ナビゲーションバーは(0、0)にあるため、ステータスバーはナビゲーションバーの上に表示されます。これを解決するには、ナビゲーションバーを下に移動するだけで(または、他の人が言ったように)、ナビゲーションバーとtopLayoutGuideの間に制約を作成します。

これを行うと、ナビゲーションバーと画面上部の間に20ポイントのギャップがあることがわかります。これは、ナビゲーションバーを20ポイント下に移動したためです。 「しかし、UINavigationControllerはそれを正しく行うことができます!」もちろん、View ControllerにUIBarPositioningDelegateを実装することで実現しています。これは、次のように実装する必要がある1メソッドのプロトコルです。

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

View ControllerをNavigation Barのデリゲートとして追加した後、Navigation Barはまだ20ポイント下に移動していますが、その背景はUINavigationControllerのようにステータスバーの下に広がります。

あなたが見ているもう一つのことは、ナビゲーションバーが半透明であるということです。つまり、ナビゲーションバーの下にあるものはある程度見えます。 translucentUINavigationBarプロパティは、iOS 7ではデフォルトでYESに設定されます。iOS7より前は、デフォルトはNOでした。

33

あなたはこれを簡単に行うことができます:

1)ナビゲーションバートップレイアウトガイドの間に制約を追加します(navigationBarを選択し、ctrlキーを押しながら、ボトムレイアウトガイドに移動し、ctrlキーを押したままにします)

Add vertical Contrain

2)select 垂直間隔

vertical spacing

3)定数をに設定します:

vertical spacing constant

結果:

result

[〜#〜] update [〜#〜]

AppDelegateファイルで、これを追加できます。

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
{
  // Prevent Navigationbar to cover the view
  UINavigationBar.appearance().translucent = false
}
4
Masterfego

あなたのviewDidLoadメソッドであなたが試すことをお勧めします:

self.navigationController.navigationBar.translucent = NO;

(デフォルトでは現在はyesです)

https://developer.Apple.com/library/ios/documentation/uikit/reference/UINavigationBar_Class/Reference/UINavigationBar.html#//Apple_ref/occ/instp/UINavigationBar/translucent

3
The dude

UIViewControllerUINavigationControllerになく、UIStoryBoardを使用している場合、デルタYの「iOS 6/7 Deltas」を20に設定できます。 UIStatusBarからオフセットする必要があるサブビュー。

enter image description here

2
Nate Potter

Swiftを使用

@Scott Berrevoetsが答えで言ったように、プロトコルpositionForBarでメソッドUIBarPositioningDelegateを実装する必要がありますが、UINavigationBarDelegateプロトコルはこのプロトコルを実装します:

public protocol UINavigationBarDelegate : UIBarPositioningDelegate {
   ...
}

Storyboardを使用して設定したdelegateUINavigationBarを設定し、メソッドを実装するだけで、次のように完了します。

class ViewController: UIViewController, UINavigationBarDelegate {

   @IBOutlet weak var navigationBar: UINavigationBar!

   override func viewDidLoad() {
       super.viewDidLoad()
       self.navigationBar.delegate = self 
   }

   override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
       // Dispose of any resources that can be recreated.
   }

   func positionForBar(bar: UIBarPositioning) -> UIBarPosition {
       return UIBarPosition.TopAttached
   }
}

注:ナビゲーションバーのy軸の位置を設定した場合、40上から20に設定する必要があるUINavigationControllerの動作をシミュレートするために、上から下にこの位置から上に伸びます。

それがあなたのお役に立てば幸いです。

2
Victor Sigler

これは私にとってはうまくいきます。あなたも同じ幸運を持っていることを望みます:)。
ビューに以下のコードを追加します。

-(void) viewDidLayoutSubviews
{
    CGRect tmpFram = self.navigationController.navigationBar.frame;
    tmpFram.Origin.y += 20;
    self.navigationController.navigationBar.frame = tmpFram;
}

基本的にナビゲーションバーの場所を変更します。

2
Jageen

それでも誰かに役立つ場合、これはiOS 7以降でナビゲーションバーを少し下に動かすのに役立ちました:

-(void)viewWillLayoutSubviews
{
    float iosVersion = 7.0;
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= iosVersion) {
        // iOS 7+
        CGRect viewFrame = self.view.frame;
        viewFrame.Origin.y += 10;
        self.view.frame = viewFrame;
    }
}

IOS 6.1以前のデバイスでは、ナビゲーションバーは以前と変わりません。

これは、ステータスバーの内容を軽くするために使用したものです。

-(UIStatusBarStyle)preferredStatusBarStyle{
    return UIStatusBarStyleLightContent;
}
2
derekg

まず、Info.plistでUIViewControllerBasedStatusBarAppearanceをNOに設定します。次に、AppDelegateapplication:didFinishLaunchingWithOptions:メソッドの追加:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
   [application setStatusBarStyle:UIStatusBarStyleLightContent];
   self.window.clipsToBounds = YES;
   self.window.frame = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height-20);
   self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height);
 }
 return YES;
2
PJR

これはIOS7の新機能です。 IOS7の20ピクセルのナビゲーションバーを0ピクセルで見つめる代わりに。ソリューションとして、ビュー全体を下に20ピクセルにシフトするか、高さ64ピクセルのナビゲーションバーに画像を使用できます。

2
PgmFreek

以前のiOSウィンドウではステータスバーの後、iOS 7では0pxから開始します。以前のバージョンでは、ビューの高さは460(iPhone 4s以前)および548(iPhone 5)ですが、iOS 7ではビューの高さは480(iPhone 4s以前)および568 (iPhone 5以降)したがって、2ピクセル以降でビューの配置を開始するか、20ピクセルからビューを開始する必要があります。

rootviewcontrollerまたは20pxからのビューを設定するためのすべてのviewcontrollerで以下のコードを書くことができます

#define IOS7_HEIGHT             64

- (void)viewDidLayoutSubviews {
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
    if ([currSysVer compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending)
    {
        CGRect frame=[self.view frame];
        if (frame.Origin.y!=IOS7_HEIGHT) {

            frame.Origin.y = IOS7_HEIGHT;
            frame.size.height -= IOS7_HEIGHT;
            [self.view setFrame:frame];
            [self.view layoutSubviews];
        }
    }
}

ステータスバーが20、ナビゲーションバーが44なので、ここでの高さは64です。以下のコードを試してください。あなたの問題は解決されます。

1
Pratik

@Masterfegoのソリューションの実装に問題がある人(これも公式ですが、Xcode 6.3と自動制約に問題があります)のために、これは私がやったことです:

ナビゲーションバーが追加されたUIViewControllerがあります。 NAvigationバーを選択し、64pxの高さ制限を追加しました。後でnavbarが高くなるという警告が表示されます(しかし、これは私たちが行うことです)。最後に、ステータスバーが素敵に見え、ナビゲーションバーと同じ色になっていることがわかります。 :)

PS:まだ画像を投稿できません。

1
cduguet

IOS 7では、アプリは画面サイズの100%を占めます。これは問題ではありません。 http://www.doubleencore.com/2013/09/developers-guide-to-the-ios-7-status-bar/

1
Amulya

おそらく、トップレイアウトガイドに添付される制約を作成して、ステータスバーに対するナビゲーションバーの位置を指定できます。レイアウトガイドの使用の詳細については、「 iOS 7 UI移行ガイド:外観と動作」セクション を参照してください。

0
Greg

それが最良の答えです。しかし、私はStoryboardの使用方法を知り、それにUINavigationBarをドラッグしたかった。デリゲートメソッドを実装し、戻り結果をUIBarPositionTopAttachedに設定すると、機能しませんでした。

- (void)viewDidLoad{
    self.navigationbar.delegate = self;
}
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar{
    NSLog(@"Got it");
    //
    //    CGRect frame = self.navigaitonBar.frame;
    //
    //    frame = CGRectMake(0, 20, CGRectGetWidth(frame), CGRectGetHeight(frame));
    //    self.navigaitonBar.frame = frame;
    //
    //    NSLog(@"frame %f",frame.Origin.y);
    return UIBarPositionTopAttached;
}
0
rbbtsn0w

Xcode 6とSwiftを使用している場合は、次のようにすることができます。

  1. アプリのinfo.plistファイルを開きます。
  2. ViewControllerBasedStatusBarAppearanceブールキーが存在しない場合は追加し、値「NO」を割り当てます。
  3. 「ステータスバースタイル」キーが存在しない場合は追加し、「不透明な黒スタイル」値を選択します。
0
Alexsander

ユーザーがModalViewControllerからMainViewControllerに戻ったときに、NavigationBarMainViewControllerの位置からフルスクリーンModalViewControllerを開くと、問題に直面していました。

ユーザーがMainViewControllerに戻ったときに、ステータスバーの高さが含まれていなかったことに気付きました。 NavigationBarに戻る前後に、ViewControllerの発生元をデバッグして確認してください。

// This method will adjust navigation bar and view content.
    private func adjustNavigationControllerIfNeeded() {

        var frame = self.view.frame
        let navigationBarHeight = self.navigationController!.navigationBar.frame.size.height

        if(frame.Origin.y == navigationBarHeight && !UIApplication.shared.isStatusBarHidden) { 

   // If status bar height is not included but it is showing then we have to adjust 
      our Navigation controller properly

            print("Adjusting navigation controller")
            let statusBarHeight = UIApplication.shared.statusBarFrame.height

            frame.Origin.y += statusBarHeight // Start view below navigation bar
            frame.size.height -= statusBarHeight
            self.view.frame = frame

            self.navigationController!.navigationBar.frame.Origin.y = statusBarHeight // Move navigation bar
        }
    }

そして、viewWillAppearメソッドから呼び出します-

override func viewWillAppear(_ animated: Bool) {

        super.viewWillAppear(animated)
        self.adjustNavigationControllerIfNeeded()
}
0
Rahul