UIView-Encapsulated-Layout-Height和Container View

时间:2015-11-30 22:47:49

标签: ios objective-c autolayout uicontainerview

我有UIViewController 1,有scroll view。在scrollview内,有container view固定在top/bottom leading/trailing(没有固定高度)。 Container view已将UITableView固定为top/bottom trailing/leadingheight constraint with 0 constant,会在updateViewConstraints内更改为内容大小高度。

当出现UIViewController 1的视图时,容器视图具有约束:

  

NSLayoutConstraint:0x7b03e5f0 V:[UITableView:0x7c42a200(54)],       NSLayoutConstraint:0x7b0ba120 V:| - (0) - [UITableView:0x7c42a200](名称:'|':UIView:0x7b0b7000),       NSLayoutConstraint:0x7b0ba1b0 V:[UITableView:0x7c42a200] - (0) - | (名称:'|':UIView:0x7b0b7000),       NSLayoutConstraint:0x7b65f900'UIView-Encapsulated-Layout-Height'V:[UIView:0x7b0b7000(0)]

将尝试通过违反约束来恢复

  

NSLayoutConstraint:0x7b03e5f0 V:[UITableView:0x7c42a200(54)]

什么是UIView-Encapsulated-Layout-Heigh t?我怎么能跳过它?因为它打破了“正确”约束(我更新到内容大小高度)。谢谢

7 个答案:

答案 0 :(得分:14)

最后我发现了一个问题。作为子视图添加到容器视图的视图具有translatesAutoresizingMaskIntoConstraints = YES,因此NSLayoutConstraint:0x7b65f900'UIView-Encapsulated-Layout-Height'V:[UIView:0x7b0b7000(0)]出现并使我遇到了一些问题。添加运行时属性translatesAutoresizingMaskIntoConstraints = NO,它将解决问题。

答案 1 :(得分:10)

最后我解决了这个问题。
1.在tableView设置中,设置:tableView.estimatedRowHeight = 100
2.在单元格的最后一个视图中,设置:make.bottom.equalTo(contentView).priority(999) 3.运行你的代码,也许没关系!

答案 2 :(得分:3)

使用解决此问题的最简单方法之一:只需降低绑定到容器视图底边的自动布局规则的优先级

这是我的容器:

enter image description here

我告诉图片视图跟随容器的底部边缘,这给了我一个冲突。要修复它,我可以降低该底边规则的优先级:

enter image description here

我说"底部"因为在我的估计中,可能是与你发生冲突的那个,但它可能是隐含地在容器上设置宽度的任何边缘。

答案 3 :(得分:2)

您应该为表格视图设置translatesAutoresizingMaskIntoConstraintscontentView,而不是在单元格的estimatedRowHeight上手动设置rowHeight或手动调整此视图的高度,正如WWDC 2014视频What's New in Table and Collection Views中所讨论的那样:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.tableView.estimatedRowHeight = 44;
    self.tableView.rowHeight = UITableViewAutomaticDimension;
}

然后,您应用于该单元格的完全限定约束将调整行高并消除那些恼人的警告。

答案 4 :(得分:0)

设置容器视图的高度约束。创建一个所述高度约束的IBOutlet,调用它" containerViewHeightConstraint"或者其他的东西。将表格视图的高度约束更新为54时,请执行以下操作:

var val1 = +$('#v1').val();
var val2 = +$('#v2').val();
var val3 = +$('#v3').val();

var total = val1+val2+val3;

$( "#total" ).val( total ); // Implicit conversion to string here

答案 5 :(得分:0)

当约束之间存在冲突时会发生这些问题。

在您的情况下,您已经为内部表视图提供了顶部/底部前导/尾部约束,它满足表视图所需的约束,因此不需要再提供一个约束(固定高度约束,常量为0)它

NSLayoutConstraint:0x7b03e5f0 V:[UITableView:0x7c42a200(54)], NSLayoutConstraint:0x7b0ba120 V:|-(0)-[UITableView:0x7c42a200]

以上两行意味着表视图的垂直方向存在一些冲突,其中常量为0。

您可以通过两种方式解决此问题,

1 - 删除高度约束,将底部约束设置为零。取出底部约束的出口并动态设置底部约束值。

2 - 删除底部空间约束,将高度约束设置为零。取高度约束出口并动态设置表格视图的高度。

希望这会对你有所帮助。

答案 6 :(得分:0)

继续使用该容器的xib - >取消选择"自动调整子视图"根据"绘图"部分。它为我修好了。 (该项目是给你约束冲突的项目)

drawing