有没有办法在不使用UINavigationController的情况下更改Storyboard中UINavigationBar的高度?

Sti*_*Sti 59 cocoa-touch objective-c uinavigationbar uinavigationcontroller ios

我想UINavigationBar在我的一个视图中使用自定义,这不是任何UINavigationController-hierarchy 的一部分.当我将其UINavigationBar拖入Storyboard时,它显示如下:

UINavigationBar的

这个条是44像素,如果状态栏不共享这个空间就足够了.因为iOS7让我们使用整个屏幕,包括状态栏的空间,UINavigationBar应该是64px高,而不是44px.

如果我将视图连接到一个UINavigationController层次结构,那么它显示正确:

UINavigationController的

我读的地方,如果UINavigationBar有属性barPosition:设置为UIBarPositionTopAttached,那么酒吧是64PX.然而,这是一个readonly属性.

我的搜索结果只显示了我认为是"解决方法"的问题.通过UINavigationController在此之前添加无用UIViewController,我可以假装有一个层次结构,它将自动添加UINavigationBar64px.

是否真的没有办法UINavigationBar覆盖64px 的"流氓"(没有导航控制器的帮助)?如果是这样的话,是否有任何正当理由说明原因?

(我不是说UINavigationBar默认情况下应该是64px,但是在检查器中应该有一个选项)

(我也看到人们用程序化的方式来解决这个问题.尽管这些答案有效,但我仍然需要设计故事板,考虑到这一点(差距).我想知道的是,是否可以将其设置为故事板,或者说,为什么不允许?)

use*_*713 45

您可以将属性设置barPositionUIBarPositionTopAttached另一种方式!

  1. 将代理添加到UINavigationBar.
  2. 落实-positionForBar:在委托类:

    - (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
    {
        return UIBarPositionTopAttached;
    }
    
    Run Code Online (Sandbox Code Playgroud)

您的导航栏顶部也必须锚定到顶部布局指南.

  • 它工作正常,我认为这是最优雅的解决方案.问题是当UINavigationBar不在UINavigationController中时,如何将UINavigationBar扩展到状态栏下方. (3认同)
  • 如何在Swift中实现这一目标?你说设置UINavigationBar的委托,即UINavigationBarDelegate,但你引用的方法是UIBarPositioningDelegate协议中的方法. (3认同)
  • 我已经完成了一篇博客文章,介绍了如何进行设置:[轻松使用没有相应导航控制器的导航栏](http://user3526.blogspot.com/2016/03/easily-use-navigation -bar-without.html) (3认同)
  • 正如"这是迄今为止最好的选择"评论一样,这是迄今为止最好的选择. (2认同)

Lyn*_*ott 26

您可以通过编程方式更改导航栏高度:

[navBar setFrame:CGRectMake(0, 0, 320, 64)];
Run Code Online (Sandbox Code Playgroud)

编辑:正如我在评论中写的那样,你可能不得不放入这一行viewDidLayoutSubviews来规避自动布局.

  • @jchnxu尝试将它放在`viewDidLayoutSubviews`中 (3认同)
  • 这在2014年是一个很好的答案,但它没有很好的老化 (3认同)
  • 我发现它在`viewDidAppear:`方法中有效.但是......下面的视图没有更新以匹配更改的高度.对答案的一个很好的改进将显示你如何调整其他视图(它是在层次结构中显示的`UINavigationTransitionView`?)来同步大小的变化(在我的情况下,我试图让它更窄,而不是更大). (2认同)

joe*_*ick 10

您可以使用Interface Builder中"Identity Inspector"中的"用户定义的运行时属性"将其设置为附加到视图的顶部.设置barPosition属性.

在此输入图像描述

以下是该barPosition属性的文档:https://developer.apple.com/library/ios/documentation/uikit/reference/UIBarPositioning_Protocol/Reference/Reference.html


bar*_*dog 8

有一种方法可以实现这一点,无需使用UINavigationController或以编程方式设置它.只需在导航栏上将高度约束设置为您想要的任何值,在此实例中为64.

您可以通过编程方式完成相同的操作:

[self.view addConstraint:[NSLayoutConstraint constraintWithItem:navigationBar attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1 constant:64.0f]];
Run Code Online (Sandbox Code Playgroud)

编辑:

正如@ n​​erdist-colony指出的那样,在使用Autolayout时,总是设置translatesAutoresizingMaskIntoConstraintsNO否则可能存在约束冲突.

  • 我真的喜欢这个主意.但是当我使用它时,我得到冲突解决错误:"<NSLayoutConstraint:0x17008d430 V:[UINavigationBar:0x13f53ad30(13)]>","<NSAutoresizingMaskLayoutConstraint:0x17828eba0 h = - & - v = - &V:[UINavigationBar :0x13f53ad30(44)]>"你怎么摆脱`NSAutoresizingMaskLayoutConstraint`? (2认同)