用于设置自动布局约束的 iOS 视图层次结构

Posted

技术标签:

【中文标题】用于设置自动布局约束的 iOS 视图层次结构【英文标题】:iOS View Hierarchy for setting up Auto Layout Constraint 【发布时间】:2013-01-19 11:49:45 【问题描述】:

视图控制器中与self.navigationController.navigationBarself.view 的子视图最近的祖先是什么,以便我可以将约束添加到该祖先?

self.searchBar = [[UISearchBar alloc] initWithFrame:CGRectZero];
[self.searchBar setTranslatesAutoresizingMaskIntoConstraints:NO];
[self.view addSubview:self.searchBar];

NSLayoutConstraint* cn = [NSLayoutConstraint constraintWithItem:self.searchBar  
attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual 
toItem:self.navigationController.navigationBar attribute:NSLayoutAttributeBottom 
multiplier:1.0 constant:0];

我试过了

[self.view addConstraint:cn];
[self.navigationController.view addConstraint:cn];

但两次我都收到错误消息,“约束是否引用了视图子树之外的内容?这是非法的。”

有人可以解释视图控制器相对于导航控制器的视图层次结构吗?

谢谢!

【问题讨论】:

您是否有理由不能在视图顶部和搜索栏顶部之间进行约束?视图的顶部应该在导航栏的底部,这样就可以得到你想要的。 【参考方案1】:

视图树如下所示:

因此,navigationController.view 是导航栏和您的视图最接近的祖先。我不确定为什么那不起作用。你把那个代码放在哪里了?

【讨论】:

我认为您评论中的建议可能是这里的方法。搜索栏应该固定在其超级视图的顶部。 谢谢!我最终在上面的评论中接受了你的建议,效果很好 @rdelmar 嗨,但是如果 NavigationBar 是半透明的,我该如何让它工作?在这种情况下,将此约束添加到 self.view 将隐藏导航栏下方的搜索栏吗?

以上是关于用于设置自动布局约束的 iOS 视图层次结构的主要内容,如果未能解决你的问题,请参考以下文章

错误:线程 1:“无法设置未准备好约束的视图层次结构的布局。”使用自动布局时

uiscrollview的自动布局,视图层次结构没有为约束做好准备

设置垂直空间iOS时自动布局图像拉伸[重复]

IOS6 使用自动布局的约束

关闭模式视图控制器后,框架不反映自动布局约束

将新视图添加到层​​次结构时的自动布局问题