奇怪的UIView封装布局高度错误

我正在做testing应用程序,所以在我的tableviewCell故事板我有imageView&webView(用于显示HTML文本)。 我设置约束像顶部/左/右/高= 200的ImageView,他们之间的间距= 5和左/右/机器人为webView,所以我想计算我的webView高度编程,然后更改单元格heigt伸展我的webView。 但是我得到了这个:

无法同时满足约束。

下面列表中的至less一个约束可能是你不想要的。

尝试这个:

(1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints & fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) ( "<NSLayoutConstraint:0x7fd6f3773f90 V:[UIImageView:0x7fd6f3773e90(200)]>", "<NSLayoutConstraint:0x7fd6f3774280 UIImageView:0x7fd6f3773e90.top == UITableViewCellContentView:0x7fd6f3462710.topMargin>", "<NSLayoutConstraint:0x7fd6f3774320 V:[UIImageView:0x7fd6f3773e90]-(5)-[UIWebView:0x7fd6f3462800]>", "<NSLayoutConstraint:0x7fd6f3774370 UITableViewCellContentView:0x7fd6f3462710.bottomMargin == UIWebView:0x7fd6f3462800.bottom>", "<NSLayoutConstraint:0x7fd6f375ee40 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fd6f3462710(205)]>" ) 

有什么build议么?

我通常通过降低AutoLayout尝试中断的约束的优先级来移除此警告。 所以如果说:

 Will attempt to recover by breaking constraint <NSLayoutConstraint:0x7fd7c2ecb520 V:[UIView:0x7fd7c2ecd0e0(300)]> 

继续,将其优先级降至999

这应该工作。

干杯。

如果使用tableView.rowHeight = UITableViewAutomaticDimension ,则应该始终设置estimatedRowHeight 。 例如:

 tableView.estimatedRowHeight = 44 

或者你应该执行:

 func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 

否则你总是会得到UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView的警告UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView ,内容会以错误的方式折叠

这个错误发生在我身上, UIButton试图通过创build与我的顶部和底部约束相冲突的UIView-Encapsulated-Layout-Height来自动调整其高度。

我通过明确添加高度约束来修复它。

对我来说,我使用单元格的估计高度,为了解决这个问题,我将约束从标签底部到它的邻居的优先级设置为999,并且它工作。

对不起,我迟到了。 🙂

如果首先需要约束,降低Autolayout试图破坏约束的优先级可能不是解决scheme。

有一天我有这个问题,这是我的布局看起来像:

  • OuterView < – C1:宽度约束等于它的超级视图
    • StackView < – C2:一个等于OuterView的宽度约束
      • ChildView < – C3:固定宽度的约束,常量= StackView.frame.size.width

这个问题发生在我减小C1宽度的时候,所以很显然,因为C3的宽度是固定的,所以原来的框架大小,减less了C1造成的冲突,C1被iOS打破了。

通过设置C3来获取StackView的widthAnchor而不是其帧大小,问题很快得到解决。

错误的约束

view.widthAnchor.constraint(equalToConstant: stackView.frame.size.width).isActive = true

正确的约束

view.widthAnchor.constraint(equalTo: stackView.widthAnchor, multiplier: 1.0).isActive = true

这样,每当C1改变时,所有的孩子约束都会相应地作出反应。

结论:

  1. 我不认为这个错误是一些错误。
  2. 通过调整优先作品来解决问题,但这是你想要的结果?
  3. 如果您决定毫无优先权地解决它,请查看您的约束,尤其是那些以编程方式设置的约束,以检查是否存在冲突。 如果处理视图的dynamic宽度或高度(如单元格视图),请确保父视图的高度或宽度约束与这些dynamic更改不冲突,并保持向上工作。

我试图实现一个简单的单元格,其中包含一行顶部标签和一个n行底部标签,可以使用较长的文本进行扩展,希望单元格能够根据我的约束自动扩展以适应内容。

有趣的是,对我来说,修复这个是重写 – tableView:heightForRowAtIndexPath:tableView:estimatedHeightForRowAtIndexPath:并返回我估计的行高度和UITableViewCellAutomaticDimension而不是设置rowHeightestimatedRowHeight在我的tableView viewDidLoad: