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

Dog*_*fee 39 position modal-dialog view navigationbar ios7

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

像这样

在此输入图像描述

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

在此输入图像描述

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

在此输入图像描述

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

谢谢

Mat*_*att 82

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

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

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

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


Dog*_*fee 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);
}
Run Code Online (Sandbox Code Playgroud)

选项2:隐藏状态栏

例如,在要隐藏状态栏的模态视图中

添加此方法

- (BOOL)prefersStatusBarHidden
{
    return YES;
}
Run Code Online (Sandbox Code Playgroud)

在viewDidLoad中添加

float currentVersion = 7.0;

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

现在,当您关闭模态视图时,您希望恢复状态栏.在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];
}
Run Code Online (Sandbox Code Playgroud)

这个,但这次没有回复

- (BOOL)prefersStatusBarHidden
{
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

选项3:嵌入导航控制器

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

在此输入图像描述


Kin*_*ard 5

Swift中:

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

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

func positionForBar(bar: UIBarPositioning) -> UIBarPosition  {
    return UIBarPosition.TopAttached
}
Run Code Online (Sandbox Code Playgroud)

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

  • 您能举例说明如何声明和分配委托吗?我正在做`类ComposeViewController:UIViewController,UIBarPositioningDelegate`然后`self.navigationController?.navigationBar.delegate = self`.由于`UIBarPositioningDelegate`不符合`UINavigationBarDelegate`,因此无法编译. (4认同)