39

在导航控制器中,您会按预期自动获得导航栏的正确颜色和位置。

像这样

在此处输入图像描述

但是在模态视图中,当您拖动导航栏时,您可以将其定位在顶部,这与运营商/电池信息太近了。

在此处输入图像描述

所以你可以把它往下拖,猜猜它与自动创建的位置匹配多远,但是你有一个颜色差异。我曾尝试更改 IB 中的状态栏设置,但没有任何区别。

在此处输入图像描述

有没有正确的方法来克服这个问题,比如使模态视图看起来像自动生成的导航视图。

谢谢

4

8 回答 8

82

在 iOS 7 中克服这个问题的最佳方法是遵循新UIBarPositioningDelegate协议。

您将 NavigationBar 的委托连接到您的视图控制器(通过情节提要或通过代码将您的视图控制器设置为导航栏的委托)并遵守该协议并通过实现该方法

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

您可以删除视图控制器中的顶部间隙。您需要将条形图放置在顶部边缘下方 20 点处

于 2014-01-07T09:11:42.653 回答
27

Figured out the 3 options for solving this problem.

Option 1: Resize the Nav Bar

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

Option 2: Hide the Status Bar

For example, in the modal view where you want to hide the status bar

Add this method

- (BOOL)prefersStatusBarHidden
{
    return YES;
}

In viewDidLoad add

float currentVersion = 7.0;

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

Now, when you dismiss the modal view, and you want your status bar back. Add this in 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];
}

and this, but return NO this time

- (BOOL)prefersStatusBarHidden
{
    return NO;
}

Option 3: Embed in Nav Controller

Select your modal view, just embed that in a Navigation Controller.

enter image description here

于 2013-09-12T00:58:25.937 回答
5

斯威夫特

在 iOS 8.1 和 Swift 中克服这个问题的最佳方法是遵循新的 UIBarPositioningDelegate 协议。

您将 NavigationBar 的委托连接到您的视图控制器并遵守该协议并通过调用方法:

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

您可以删除视图控制器中的顶部间隙。您需要将条形图放置在顶部边缘下方 20 点处。

于 2014-12-04T17:21:43.723 回答
2

对于 Swift3 使用以下..

func position(for bar: UIBarPositioning) -> UIBarPosition{
    return .topAttached;
}
于 2016-09-15T02:34:21.337 回答
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;
}
于 2014-05-13T00:02:20.940 回答
0

我创建了一个导航控制器,删除了与它一起出现的“根视图控制器”。然后按住 ctrl 并拖动 View 上的“导航控制器”(删除之前手动添加的导航栏)。将导航控制器设置为“初始视图控制器”,它现在对我来说很好。

于 2014-07-28T18:14:26.220 回答
0

isTranslucent默认设置为true。将其设置为false将扩展状态栏下方的导航栏。

navigationBar.isTranslucent = false

于 2019-09-14T08:40:45.980 回答
-7

我关闭了“使用自动布局”,它对我有用。

于 2013-09-16T11:57:01.443 回答