web-dev-qa-db-ja.com

モーダルビューのナビゲーションバーの位置-iOS7

Navigation Controllerでは、期待どおりにNavigation Barの正しい色と位置が自動的に取得されます。

このような

enter image description here

ただし、モーダルビューでは、ナビゲーションバーにドラッグすると、キャリア/バッテリー情報に近すぎる最上部に配置できます。

enter image description here

そのため、それを下にドラッグして、自動作成された位置とどれだけ一致するかを推測できますが、色の不一致が生じます。 IBでステータスバーの設定を変更しようとしましたが、違いはありません。

enter image description here

モーダルビューを自動生成されたナビゲーションビューのように表示するなど、これを克服する正しい方法はありますか。

ありがとう

39
DogCoffee

IOS 7でこれを克服する最良の方法は、新しいUIBarPositioningDelegateプロトコルに準拠することです。

NavigationBarのデリゲートをView Controllerに接続し(ストーリーボードまたはコードを介してView ControllerをNavigation Barのデリゲートとして設定し)、そのプロトコルに準拠し、メソッドを実装します。

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

View Controllerの上部のギャップを削除できます。バーを上部エッジの20ポイント下に配置する必要があります

81
Matt

この問題を解決するための3つのオプションを見つけました。

オプション1:ナビゲーションバーのサイズを変更する

float currentVersion = 7.0;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
    // iOS 7
    self.navBar.frame = CGRectMake(self.navBar.frame.Origin.x, self.navBar.frame.Origin.y, self.navBar.frame.size.width, 64);
}

オプション2:ステータスバーを非表示にする

たとえば、ステータスバーを非表示にするモーダルビューで

このメソッドを追加

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

ViewDidLoadで追加

float currentVersion = 7.0;

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
    [self prefersStatusBarHidden];
    [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}
else {
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
}

モーダルビューを閉じて、ステータスバーを元に戻したい場合。これをviewWillAppearに追加します

    float currentVersion = 7.0;

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
    [self prefersStatusBarHidden];
    [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
    NSLog(@"ios7");
}
else {
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
}

そして、これは今回はNOを返します

- (BOOL)prefersStatusBarHidden
{
    return NO;
}

オプション3:ナビゲーションコントローラーに埋め込む

モーダルビューを選択し、ナビゲーションコントローラーに埋め込みます。

enter image description here

27
DogCoffee

In Swift

IOS 8.1およびSwiftでこれを克服する最良の方法は、新しいUIBarPositioningDelegateプロトコルに準拠することです。

NavigationBarのデリゲートをView Controllerに接続し、そのプロトコルに準拠して、メソッドを呼び出します。

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

View Controllerの上部のギャップを削除できます。バーを上部エッジの20ポイント下に配置する必要があります。

5
King-Wizard

Swift3の場合は、次を使用します。

func position(for bar: UIBarPositioning) -> UIBarPosition{
    return .topAttached;
}
2
Susobhan Das

Navigation Controllerを作成し、それとともに表示された「Root View Controller」を削除しました。次に、Ctrlキーを押しながら、ビューの「Navigation Controller」をドラッグします(前に手動で追加したナビゲーションバーを削除します)。 Navigation Controllerを「Initial View Controller」として設定すると、今ではうまく機能します。

0

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;
    }
}

また、コンテンツに合わせてステータスバーの色を調整しました。

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