有没有办法改变故事板中的UINavigationBar的高度,而不使用UINavigationController?
我想在我的一个视图中使用自定义的UINavigationBar
,这不是任何UINavigationController
-hierarchy的一部分。 当我将一个UINavigationBar
拖入Storyboard时,它显示如下:
这个栏是44px,如果状态栏不能共享这个空间就足够了。 由于iOS7允许我们使用整个屏幕,包括状态栏的空间, UINavigationBar
应该是64px高,而不是44px。
如果我将视图连接到一个UINavigationController
的层次结构,那么它显示正确的:
我读了一个地方, 如果 UINavigationBar
的属性barPosition:
设置为UIBarPositionTopAttached
,那么栏将是64px。 但是,这是一个readonly
属性。
我的search结果只显示了一些我认为是“解决方法”的内容。 通过在这个UIViewController
之前添加一个无用的UINavigationController
,我可以假装有一个层次结构,它将自动添加64像素的UINavigationBar
。
是否真的没有办法有一个'stream氓'(没有导航控制器的帮助下)覆盖64px的UINavigationBar
? 如果是这样的话,有什么合理的理由呢?
(我不是说默认情况下UINavigationBar
应该是64px,但是在检查器中应该有一个选项)
(我也看到有人用程序化的方式来解决这个问题,尽pipe这些答案很有效,但是我还是要devise一个故事板(差距),我想知道的是如果可以设置的话故事板,或者说,为什么不允许?)
你可以设置属性barPosition
为UIBarPositionTopAttached
另一种方式!
- 给你添加一个委托UINavigationBar。
-
在委托类中实现
-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]];
编辑:
正如@ nerdist-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约束。
它到底是什么样子?