iOS程序化约束:'在容器层次结构中找不到视图'

时间:2015-01-21 17:12:19

标签: ios objective-c autolayout constraints

我的iOS自定义UITableViewCell需要以下布局:

|查看基本信息|长矩形视图列表|

因此,结构如下。我有一个滚动视图,将水平滚动,我有"信息容器视图"在左侧,矩形视图列表应显示在信息容器的右侧。自定义UITableViewCell是o

enter image description here

我试图添加以下约束:

[self.scrollView addConstraints:[NSLayoutConstraint
                                             constraintsWithVisualFormat:[NSString stringWithFormat:@"H:[info]-space-[%@]", key]
                                             options:0 metrics:metrics
                                             views:viewsDictionary]];

其中info是" Info Container"和"关键"指的是动态添加的视图。这会导致以下错误:

2015-01-21 16:37:44.603 AirCourts[3264:1553444] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x174a83840 H:[UIView:0x17018f970]-(20)-[FieldSlotView:0x1701bebc0]>
Constraint: <NSLayoutConstraint:0x174a83840 H:[UIView:0x17018f970]-(20)-[FieldSlotView:0x1701bebc0]>
(...)
View not found in container hierarchy: <UIView: 0x17018f970; frame = (0 0; 320 568); autoresize = RM+BM; layer = <CALayer: 0x170e37c20>>
That view's superview: NO SUPERVIEW

所以,似乎它指的是&#34;信息容器&#34;没有超级视图。因此,我决定测试它:

Error

如您所见,它不被假定为scrollview的后代。鉴于IB层次结构似乎是正确的,为什么会发生这种情况?在出于某种原因添加约束之前是否需要刷新布局,还是丢失了层次结构信息?

提前致谢!

2 个答案:

答案 0 :(得分:0)

在我看来,你得到了这个错误,因为动态加载的视图&#39;不是scrollView的直接孩子,而是infoView的直接孩子。

因此,为了让AutoLayout在此工作,您宁愿将该约束附加到其父视图,该视图应为infoView,而不是scrollView

从日志中可以看出,您的infoView为[UIView:0x17018f970],而AutoLayout会尝试在其层次结构下找到您的[FieldSlotView:0x1701bebc0]。这就是您遇到错误View not found in container hierarchy: <UIView: 0x17018f970>

的原因

小提示

将约束附加到视图时,可以在约束字符串中以|的形式访问它。所以,如果你要将代码替换为

[self.infoView addConstraints:[NSLayoutConstraint
                                             constraintsWithVisualFormat:[NSString stringWithFormat:@"H:|-space-[%@]", key]
                                             options:0 metrics:metrics
                                             views:viewsDictionary]];

您可以将[info]替换为|;)

答案 1 :(得分:0)

对于 iOS 8.0 + ,苹果公司建议简单地激活/取消约束比较安全。他们将处理受影响的视图。

比如说您已经声明

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *constraintProperty;

然后在代码中的某处:

[_constraintProperty setActive:NO];

// create constraint here

[NSLayoutConstraint activateConstraints:@[_constraintProperty]];

请参阅文档中的讨论:

https://developer.apple.com/documentation/uikit/uiview/1622513-addconstraints https://developer.apple.com/documentation/uikit/uiview/1622659-removeconstraint