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

Posted

技术标签:

【中文标题】模态视图导航栏的位置 - iOS7【英文标题】:Position of navigation bar for modal view - iOS7 【发布时间】:2013-09-15 05:47:36 【问题描述】:

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

喜欢这个

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

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

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

谢谢

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

感谢@CharlieSeligman,但看到我的答案不是很老,人们可能已经看够了,特别是因为它没有被标记为正确的答案。 @Matt 救了我几根白发!非常感谢。 @Matt,好东西!我把我的答案改成了你的,这是一个干净的方法。 @Smick 我很高兴能提供帮助。 iOS7 推出时,我花了很多时间挖掘。 “您将 NavigationBar 的委托连接到您的视图控制器”是什么意思?如果您仅在 ViewController 中符合 UIBarPositioningDelegate,则 myNavBar.delegate = self 不起作用。【参考方案2】:

想出了解决这个问题的 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:嵌入导航控制器

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

【讨论】:

我遇到了同样的问题,我使用了您回答中的选项 1 效果很好。您是否找到了另一种在界面生成器中设置导航栏大小的方法?我只是想知道在导航控制器中嵌入某些东西是否会自动生成正确的栏,那么可能有一种方法可以做到这一点,而不是在每个视图控制器中调整它的大小。 @Naveed,在 IB 中还没有找到方法。我还没有看你的第二个想法。 我觉得这一切都有点复杂,只要看看我在下面发布的内容,如果可以的话给我一个反馈。无论如何,感谢您的解决方法 您的第三个解决方案正在为我创造奇迹。它解决了我两个问题 1 - 没有靠近电池的标题按钮 2 - 当我向下滚动表格时标题不会消失,我需要做更多的工作,否则对于未嵌入导航控制器的独立导航栏。 分配给 navigationBar.frame 无效。【参考方案3】:

Swift 中:

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

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

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

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

【讨论】:

你能举个例子详细说明如何声明和分配委托吗?我正在做class ComposeViewController: UIViewController, UIBarPositioningDelegate,然后是self.navigationController?.navigationBar.delegate = self。这不会编译,因为 UIBarPositioningDelegate 不符合 UINavigationBarDelegate【参考方案4】:

对于 Swift3 使用以下..

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

【讨论】:

【参考方案5】:

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

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

navigationBar.isTranslucent = false

【讨论】:

【参考方案8】:

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

【讨论】:

使用自动布局在这里根本不是问题。我认为人们想使用 Autolayout 并解决这个问题,很抱歉投反对票,但你的回答没有用

以上是关于模态视图导航栏的位置 - iOS7的主要内容,如果未能解决你的问题,请参考以下文章

模态 Segue 进入没有导航栏的导航控制器

带有透明/模糊导航栏的 iOS 7 视图控制器布局问题

iOS 7:在底部导航栏的表格视图之间滑动

导航栏视图作为模态视图?

模态视图导航栏未正确显示

如何设置导航栏的后退项