我的iOS自定义UITableViewCell需要以下布局:
|查看基本信息|长矩形视图列表|
因此,结构如下。我有一个滚动视图,将水平滚动,我有"信息容器视图"在左侧,矩形视图列表应显示在信息容器的右侧。自定义UITableViewCell是o
我试图添加以下约束:
[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;没有超级视图。因此,我决定测试它:
如您所见,它不被假定为scrollview的后代。鉴于IB层次结构似乎是正确的,为什么会发生这种情况?在出于某种原因添加约束之前是否需要刷新布局,还是丢失了层次结构信息?
提前致谢!
答案 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