【问题标题】:UIView-Encapsulated-Layout-Height and Container ViewUIView-Encapsulated-Layout-Height 和容器视图
【发布时间】:2016-03-04 17:29:48
【问题描述】:

我有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的View出现时,Container View有约束:

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-Height 是什么?我怎么能跳过它?因为它打破了“正确”约束(我更新到内容大小高度)。谢谢

【问题讨论】:

  • 认为这是您的表格视图单元格的高度。你是怎么设置的?
  • 我对单元格没有任何限制。单元格高度由 heightForRowAtIndexPath: 确定,返回 tableView.rowHeight。怎么可能?谢谢
  • 构建和运行时会出现什么?您是否尝试过更改视图的背景颜色以便查看它们是如何绘制的?
  • 显示的容器视图高度为零。但是我想根据内容视图调整大小,但是 NSLayoutConstraint:0x7b03e5f0 V:[UITableView:0x7c42a200(54)] 被删除了,因为这个约束 NSLayoutConstraint:0x7b65f900 'UIView-Encapsulated-Layout-Height' V:[UIView :0x7b0b7000(0)]
  • 如何使容器视图具有基于内容视图的高度(我确定内容视图对宽度/高度有正确的约束)?

标签: ios objective-c autolayout uicontainerview


【解决方案1】:

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

【讨论】:

  • 天哪,我搜索了很长时间,这确实有效。
  • 谢谢,这对我很有帮助,我搜索了很多关于这个问题
  • 谢谢,效果很好,警告消失了。
  • 将最终连接约束的优先级降低到单元格的 contentView 似乎是正确的答案。如果您看到同样的问题,这也适用于 UICollectionViewCell。
【解决方案2】:

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

【讨论】:

  • 这解决了我的问题!添加容器视图后。使用 prepareForSegue 方法到达视图,然后将该视图的 translatesAutoresizingMaskIntoConstraints 设置为 false
  • 也可以在运行时属性的界面生成器中设置
  • 谢谢!我正在添加一个子视图控制器(不使用容器视图,在代码中明确),我忘记将子 VC 视图的 translatesAutoresizingMaskIntoConstraints 属性设置为 false
【解决方案3】:

采用一种最简单的方法来解决这个问题:只需降低绑定到容器视图底部边缘的自动布局规则的优先级

这是我的容器:

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

我说“底部”是因为据我估计,这可能是您会与之发生冲突的地方,但它可能是在容器上隐式设置宽度的任何边缘。

【讨论】:

  • 谢谢!使用 SnapKit 我赚了 $0.bottom.equalToSuperview().offset(-5).priority(.low)
【解决方案4】:

与其在单元格的contentView 上手动设置translatesAutoresizingMaskIntoConstraints 或手动调整此视图的高度,不如为tableview 设置estimatedRowHeightrowHeight,如WWDC 2014 视频@987654321 中所述@:

- (void)viewDidLoad {
    [super viewDidLoad];

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

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

【讨论】:

    【解决方案5】:

    进入项目容器的 xib -> 取消选择“绘图”部分下的“自动调整子视图”。它为我修好了。 (项目是给你约束冲突的项目)

    【讨论】:

      【解决方案6】:

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

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

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

      两行以上表示表格视图在垂直方向上存在一些冲突,它具有常数 0。

      有两种方法可以解决这个问题,

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

      2 - 移除底部空间限制,将高度限制设置为零。取出高度约束,动态设置table view的高度。

      希望这会对你有所帮助。

      【讨论】:

        【解决方案7】:

        设置容器视图的高度约束。创建所述高度约束的 IBOutlet,将其称为“containerViewHeightConstraint”或其他名称。当您将 table view 的高度约束更新为 54 时,可以这样说:

        self.containerViewHeightConstraint.constant = 54.0;
        

        【讨论】:

        • 感谢您的回答,但 containerViewHeightConstraint 和 TableViewConstraint 位于不同的视图控制器中。我怎么知道在视图控制器 1 中,tableview 约束何时更改?谢谢
        • 你可以使用委托或NSNotificationCenter
        • 这是不好的方法,我希望(并且肯定)有更好的解决方案。尽管如此,谢谢
        • 真正糟糕的方法是使用子视图控制器。你应该避免这种做法。但我试图告诉你,你说的毫无意义。您将所有内容都固定在边缘,然后将高度设置为零,您一定会从自动布局中收到警告或错误。你应该调查那些。
        • 我只能从滚动视图工作,容器被固定,因为滚动视图无法确定它的内容大小。但我想要的是容器视图的高度基于它所代表的内容。谢谢
        猜你喜欢
        • 1970-01-01
        • 2021-05-21
        • 2015-04-09
        • 2015-10-09
        • 2015-11-18
        • 2017-02-01
        • 2021-09-01
        • 2015-01-13
        • 1970-01-01
        相关资源
        最近更新 更多