Ios 有没有一种方法可以在不使用UINavigationController的情况下更改情节提要中UINavigationBar的高度?
我想在我的一个视图中使用自定义的Ios 有没有一种方法可以在不使用UINavigationController的情况下更改情节提要中UINavigationBar的高度?,ios,objective-c,cocoa-touch,uinavigationcontroller,uinavigationbar,Ios,Objective C,Cocoa Touch,Uinavigationcontroller,Uinavigationbar,我想在我的一个视图中使用自定义的UINavigationBar,它不是任何UINavigationController-层次结构的一部分。当我将UINavigationBar拖动到情节提要中时,它显示如下: 此栏为44px,如果状态栏不共享此空间,这就足够了。因为iOS7允许我们使用整个屏幕,包括状态栏的空间,所以UINavigationBar的高度应该是64px,而不是44px 如果我将视图连接到UINavigationController的层次结构,则它将显示正确的: 我在某个地方读到如
UINavigationBar
,它不是任何UINavigationController
-层次结构的一部分。当我将UINavigationBar
拖动到情节提要中时,它显示如下:
此栏为44px,如果状态栏不共享此空间,这就足够了。因为iOS7允许我们使用整个屏幕,包括状态栏的空间,所以UINavigationBar
的高度应该是64px,而不是44px
如果我将视图连接到UINavigationController
的层次结构,则它将显示正确的:
我在某个地方读到如果UINavigationBar
的属性barPosition:
设置为uibarpositiontopassed
,则该条将为64px。但是,这是一个只读属性
我的搜索结果只显示了一些我认为是“工作”的东西。通过在此UIViewController
之前添加一个无用的UINavigationController
,我可以假装有一个层次结构,它会自动添加带有64px的UINavigationBar
真的没有办法让一个覆盖64px的“无赖”(没有导航控制器的帮助)UINavigationBar
?
如果是这样的话,有没有合理的理由说明原因
(我不是说默认情况下,UINavigationBar
应该是64px,但在inspector中应该有一个选项)
(我也看到有人用编程的方法来解决这个问题。即使这些答案有效,我仍然必须在设计情节提要时考虑到这一点(一个缺口)。我想知道的是,是否可以在情节提要中设置,或者说,为什么不允许设置?)您可以通过编程方式更改导航栏高度:
[navBar setFrame:CGRectMake(0, 0, 320, 64)];
编辑:正如我在评论中所写,您可能必须将此行放入viewDidLayoutSubviews
以避免自动布局。您可以通过另一种方式将属性barPosition
设置为UIBarPositionTopAttached
将代理添加到UINavigationBar
在委托类中实现-positionForBar:
:
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
{
return UIBarPositionTopAttached;
}
-(UIBAR位置)位置FORBAR:(id)bar
{
返回UIBarPositionTopAttached;
}
导航栏的顶部也必须锚定到顶部布局指南。我也在使用独立的UINavigationBar,我遇到了相同的问题,我发现有两种方法可以正确修复此问题
我使用约束和父视图修复了它。我在故事板中将此UIView设置为带有{0,0,320,64}帧的UINavigationBar的父视图。可以添加一个约束或一组约束,强制UINavigationBar具有所需的大小。
如果您的父UIView在情节提要中具有正确的框架,您可以像往常一样在情节提要中布局其他视图
现在,如果禁用了autolayout,您可以按照Lindsey的回答中所述以编程方式更改条形图高度。
-(void)viewDidLayoutSubviews
似乎是一个很好的选择。您可以使用Interface Builder中“Identity Inspector”中的“用户定义的运行时属性”将其设置为附加到视图顶部。设置barPosition
属性
以下是barPosition
属性的文档:有一种方法可以实现这一点,而无需使用UINavigationController
或以编程方式设置它。只需将导航栏上的高度约束设置为任意值,在本例中为64
您可以通过编程方式完成相同的任务,如下所示:
[self.view addConstraint:[NSLayoutConstraint constraintWithItem:navigationBar attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeHeight multiplier:1 constant:64.0f]];
编辑:
正如@nerdist colony所指出的,在使用Autolayout时,总是要将TranslatesAutoResizingMacSkinToConstraints
设置为NO
,否则约束中可能会有冲突。@startupThekid:
如果您尝试更改由UINavigationController管理的UINavigationBar的自动调整大小掩码,iOS将生成异常
但是,您发布的目标C代码的Swift等价物是:
var navBar = self.navigationController!.navigationBar
在视图中显示():
需要设置约束的位置:
Therafter您应该能够根据需要修改约束的常量属性,以改变导航条高度,例如改变设备方向,我在同一条船上遇到了问题,但现在我已经修复了它。我正在尝试做正确的事情来避免显式设置框架,这对于未来的打样和对不同设备尺寸的轻松支持是可取的。在我的例子中,我希望在导航栏下面有一个webview
我正在将视图控制器设置为UINavigationBarDelegate
,并实现positionForBar:
以返回uibarpositiontopatted
,如。另一个技巧似乎是使用“自动布局”将条定位在topLayoutGuide下方
这是我在以编程方式创建导航栏和webview后在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]];
但我对自动布局做了更多的思考和尝试,结果证明这就是我问题的原因。我试图依靠导航栏的自动调整大小掩码转换的约束,但结果证明我需要显式地定义它们。下面是我的新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]];
是的,正如我所希望的,这会在转向横向时自动移动条,而状态条会隐藏
(我诚恳地推荐一个自动布局辅助工具,如Mashine,它可以使布局代码更加简洁,而Mashine则负责为您关闭TranslatesAutoResizingMackintoConstraints
)我知道这是一种非常老套的方法,但f
[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]];
[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]];