模态视图导航栏的位置 - iOS7

时间:2013-09-11 09:17:35

标签: view position modal-dialog ios7 navigationbar

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

像这样

enter image description here

但是在模态视图中,当你在导航栏中拖动时,你可以将它放在顶部,这太靠近载体/电池信息了。

enter image description here

所以你可以将它向下拖动,猜测它与自动创建的位置匹配的距离,但是你有一个颜色差异。我试过更改IB中的状态栏设置,没有什么区别。

enter image description here

是否有正确的方法可以解决这个问题,例如使模态视图看起来像自动生成的导航视图。

由于

8 个答案:

答案 0 :(得分:81)

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

将NavigationBar的委托连接到视图控制器(通过故事板或代码将视图控制器设置为导航栏的委托)并遵循该协议并实施方法

  

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

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

答案 1 :(得分:27)

找出解决此问题的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];
}

这个,但这次没有回复

- (BOOL)prefersStatusBarHidden
{
    return NO;
}

选项3:嵌入导航控制器

选择您的模态视图,只需将其嵌入导航控制器中即可。

enter image description here

答案 2 :(得分:5)

Swift

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

您将NavigationBar的委托连接到视图控制器并符合该协议并调用方法:

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

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

答案 3 :(得分:2)

对于Swift3使用以下..

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

答案 4 :(得分: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;
}

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

navigationBar.isTranslucent = false

答案 7 :(得分:-6)

我关闭了“使用Autolayout”,它对我有用。