有没有办法改变故事板中的UINavigationBar的高度,而不使用UINavigationController?

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

UINavigationBar的

这个栏是44px,如果状态栏不能共享这个空间就足够了。 由于iOS7允许我们使用整个屏幕,包括状态栏的空间, UINavigationBar应该是64px高,而不是44px。

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

UINavigationController的

我读了一个地方, 如果 UINavigationBar的属性barPosition:设置为UIBarPositionTopAttached ,那么栏将是64px。 但是,这是一个readonly属性。

我的search结果只显示了一些我认为是“解决方法”的内容。 通过在这个UIViewController之前添加一个无用的UINavigationController ,我可以假装有一个层次结构,它将自动添加64像素的UINavigationBar

是否真的没有办法有一个'stream氓'(没有导航控制器的帮助下)覆盖64px的UINavigationBar ? 如果是这样的话,有什么合理的理由呢?

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

(我也看到有人用程序化的方式来解决这个问题,尽pipe这些答案很有效,但是我还是要devise一个故事板(差距),我想知道的是如果可以设置的话故事板,或者说,为什么不允许?)

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

  1. 给你添加一个委托UINavigationBar。
  2. 在委托类中实现-positionForBar:

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

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

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

 [navBar setFrame:CGRectMake(0, 0, 320, 64)]; 

编辑:正如我在评论中写的,你可能不得不把这一行viewDidLayoutSubviews规避自动布局。

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

在这里输入图像说明

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

有一种方法可以在不使用UINavigationController或以编程方式进行设置的情况下完成此操作。 只要在导航栏上设置一个高度约束就可以了,在这个例子中是64。

你可以通过编程来完成同样的事情:

 [self.view addConstraint:[NSLayoutConstraint constraintWithItem:navigationBar attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1 constant:64.0f]]; 

编辑:

正如@ n​​erdist-colony指出的,在使用Autolayout时,总是将translatesAutoresizingMaskIntoConstraints设置为NO否则在约束中可能会有冲突。

我也使用独立的UINavigationBar,我遇到了同样的问题,我发现有两种方法正确地解决这个问题。

我使用约束和父UIView修复了它。 我将这个UIView作为我的UINavigationBar的{0,0,320,64}框架的父视图在故事板中。 您可以添加一个约束或一组约束,强制UINavigationBar具有所需的大小。 考虑到你的父母的UIView在你的故事板中有正确的框架,你可以像往常一样布局你的故事板中的其他视图。

现在,如果自动布局被禁用,您可以按照Lindsey的回答中所述以编程方式更改高度。 -(void)viewDidLayoutSubviews似乎是一个很好的select。

如果您使用Autolayout,则可以将UINavigationBar的约束高度设置为64或更多事件。

@startupThekid:

如果您尝试更改由UINavigationControllerpipe理的UINavigationBar的自动调整掩码,iOS将会生成一个exception。

但是,您发布的目标C代码的Swift等价物是:

 var navBar = self.navigationController!.navigationBar 

viewDidAppear ()中:

 navBar.setTranslatesAutoresizingMaskIntoConstraints = false 

无论你需要设置约束:

 var navBarHeightConstraint = NSLayoutConstraint(item: navBar, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .Height, multiplier: 1, constant: height) self.view.addConstraint(navBarHeightConstraint) 

之后,您应该可以根据需要修改约束的常量属性,以更改导航栏高度,例如更改设备方向

我写了一篇博客文章,详细介绍了如何用最less的代码干预来实现这一点。 你的酒吧会在故事板上显示一个空白,但它会在设备上正常工作。 总之,步骤是:

1)将导航栏添加到故事板中的视图控制器。

2)在故事板中设置导航栏的约束条件:
– 导航Bar.Top =顶部布局Guide.Bottom
– 导航Bar.Leading = Superview.Leading
– 导航Bar.Trailing = Superview.Trailing

3)将故事板的导航栏作为@IBOutlet连接到其视图控制器。

4)在视图控制器的类中,为类声明添加一个UINavigationBarDelegate协议。

5)在视图控制器的viewDidLoad方法中,将导航栏的代理设置为self。

6)在视图控制器中,添加栏定位委托的positionForBar方法。 返回表示TopAttached的UIBarPosition。 (注意:UINavigationBarDelegate从UIBarPositioningDelegateinheritance这个方法。)

完整的post与GIF图像在这里:
轻松使用没有相应导航控制器的导航栏

这些步骤从Swift 2.1 / Xcode 7.2开始工作

我坐在同一条船上,有问题,但现在我已经修好了。 我正在努力做正确的事情,以避免明确设置框架,这对于面向未来的应用以及对不同设备大小的简单支持是可取的。 就我而言,我想要一个导航栏下的web视图。

我设置我的视图控制器是一个UINavigationBarDelegate和实现positionForBar:返回UIBarPositionTopAttached ,就像user3269713的答案 。 这似乎是另一个窍门是使用自动布局将栏放在topLayoutGuide下方。

我在viewDidLoad以编程方式创build导航栏和web viewDidLoad后使用的代码,我仍然看到酒吧高度44卡住,但不能立即看到原因:

  [navigationBar sizeToFit]; navigationBar.delegate = self; [self.view addSubview:navigationBar]; [self.view addSubview:webView]; id guide = self.topLayoutGuide; NSDictionary *viewNamesDict = NSDictionaryOfVariableBindings(webView, navigationBar, guide); [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[webView]|" options:0 metrics:nil views:viewNamesDict]]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[guide][navigationBar][webView]|" options:0 metrics:nil views:viewNamesDict]]; 

但是我做了一些更多的思考和玩弄自动布局,事实certificate,这本身就是我的问题的原因。 我试图依靠导航栏的自动调整掩码的约束,但事实certificate,我需要明确地定义它们。 这是我的新viewDidLoad代码工作:

  [navigationBar sizeToFit]; navigationBar.delegate = self; navigationBar.translatesAutoresizingMaskIntoConstraints = NO; [self.view addSubview:navigationBar]; [self.view addSubview:webView]; id guide = self.topLayoutGuide; NSDictionary *viewNamesDict = NSDictionaryOfVariableBindings(webView, navigationBar, guide); [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[navigationBar]|" options:0 metrics:nil views:viewNamesDict]]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[webView]|" options:0 metrics:nil views:viewNamesDict]]; NSString *verticalLayoutVisualExpression = [NSString stringWithFormat:@"V:|[guide][navigationBar(%f)][webView]|", navigationBar.frame.size.height]; [self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:verticalLayoutVisualExpression options:0 metrics:nil views:viewNamesDict]]; 

是的,正如我所希望的那样,当转向横向和状态栏隐藏时,会自动移动栏。

(我衷心推荐一个像砌体这样的自动布局助手,使布局代码更加简洁,例如Masonry负责为您closurestranslatesAutoresizingMaskIntoConstraints自动化鼠标caching约束)

我知道这是一个非常黑客的做法,但对我来说,它的工作。 我有一个NavigationViewController ,我想加载一个ViewController的模态,其中有一个UINavigationBar在顶部与完成和取消button。 这是它的样子: 在这里输入图像说明

正如你所看到的,在顶部有一个白色的带子,我想和UINavigationBar一样的颜色。 而不是以编程方式更改UINavigationBar的高度,我只是做了一个新的视图,并将其背景色设置为UINavigationBar (HEX = F8F8F8,RGBA = 248,248,248,1.0)。 再次,我知道这是超级哈克,但它为我完成了工作。 这是现在的样子

在这里输入图像说明

在使用主要故事板的Swift 3中,可以使用约束来改变高度并使其工作。 这是我发现的方式很容易实现。

创build约束。

它到底是什么样子?