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