AutoLayout:在代码中居中两个视图会导致约束异常?

Posted

技术标签:

【中文标题】AutoLayout:在代码中居中两个视图会导致约束异常?【英文标题】:AutoLayout: Centering two views in code causes constraint exception? 【发布时间】:2013-03-22 22:34:23 【问题描述】:

短版:创建NSLayoutAttributeCenterX 约束总是会导致约束失败。为什么?

我有一个UITextField 子类,其行为类似于搜索文本框。您点击该框并出现一个项目列表,这些项目按您输入的内容进行过滤。像这样:

UITextField 子类负责创建和显示项目的视图。列表的中心应与文本字段的中心匹配。所以,我这样设置约束:

NSLayoutConstraint *hugCenter = 
   [NSLayoutConstraint constraintWithItem:self.searchContainerView
                                attribute:NSLayoutAttributeCenterX
                                relatedBy:NSLayoutRelationEqual
                                   toItem:self
                                attribute:NSLayoutAttributeCenterX
                               multiplier:1.0
                                 constant:0.0];

这总是会导致错误:

将尝试通过打破约束来恢复 NSLayoutConstraint:0x9a5e1a0 UIView:0x9a5ba40.centerX == SearchTextField:0x7154a40.centerX

为了测试,我让我的场景尽可能简单——视图控制器上有 1 个文本字段:

为什么这会导致约束错误?

【问题讨论】:

继续调查:这似乎与 textField 在其父视图中水平居中的事实有关。我仍然不明白为什么这很重要。列表应以 textField 为中心,textField 应以 superview 为中心。我没有看到它们是如何相互排斥的。 在控制台中,就在“将尝试恢复..”之前,您应该已经看到了所有相关约束的列表。请复制/粘贴到您的问题中。 【参考方案1】:

您是否在某处缺少setTranslatesAutoresizingMaskIntoConstraints:

【讨论】:

我尝试在UITextField 子类和创建的列表视图中将其设置为NO。没区别。我显然不能在场景的根视图上设置它,因为从子视图设置它肯定是个坏主意。

以上是关于AutoLayout:在代码中居中两个视图会导致约束异常?的主要内容,如果未能解决你的问题,请参考以下文章

swift-无法使用 AutoLayout 在 UIScrollView 中居中 UIImageView

添加、删除和再次添加视图会破坏 AutoLayout 约束

Autolayout - 当一个视图具有动态高度时,在 UITableViewCell 中垂直居中两个视图

如何使用 AutoLayout 使两个视图居中

iOS Autolayout:两个等宽等间距的视图

ios-AutoLayout(自动布局代码控制)简单总结