导航栏位置为模态视图 – iOS7

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

喜欢这个

在这里输入图像说明

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

在这里输入图像说明

所以你可以把它拖下来,猜测它与自动创build的位置相匹配的程度,但是你有一个颜色差异。 我已经尝试在IB中更改状态栏设置,没有什么区别。

在这里输入图像说明

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

谢谢

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

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

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

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

找出解决这个问题的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:embedded导航控制器

select你的模态视图,只需将其embedded到导航控制器中即可。

在这里输入图像说明

Swift中

在iOS 8.1和Swift中解决这个问题的最好方法就是符合新的UIBarPositioningDelegate协议。

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

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

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

对于Swift3使用以下..

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

经过几次尝试在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; } 

我创build了一个导航控制器,删除了与它一起出现的“根视图控制器”。 然后按住Ctrl键并拖动视图上的“导航控制器”(删除您之前手动添加的导航栏)。 将导航控制器设置为“初始视图控制器”,现在它适用于我。

我把“使用Autolayout”closures,它为我工作。