奇怪的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
- StackView < – C2:一个等于OuterView的宽度约束
这个问题发生在我减小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改变时,所有的孩子约束都会相应地作出反应。
结论:
- 我不认为这个错误是一些错误。
- 通过调整优先作品来解决问题,但这是你想要的结果?
- 如果您决定毫无优先权地解决它,请查看您的约束,尤其是那些以编程方式设置的约束,以检查是否存在冲突。 如果处理视图的dynamic宽度或高度(如单元格视图),请确保父视图的高度或宽度约束与这些dynamic更改不冲突,并保持向上工作。
我试图实现一个简单的单元格,其中包含一行顶部标签和一个n行底部标签,可以使用较长的文本进行扩展,希望单元格能够根据我的约束自动扩展以适应内容。
有趣的是,对我来说,修复这个是重写 – tableView:heightForRowAtIndexPath:
和tableView:estimatedHeightForRowAtIndexPath:
并返回我估计的行高度和UITableViewCellAutomaticDimension
而不是设置rowHeight
和estimatedRowHeight
在我的tableView viewDidLoad: