首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么是NSLayoutConstraint“UIView-Encapsulated Layout-Height”?我应该如何强制它干净地重新计算?

什么是NSLayoutConstraint“UIView-Encapsulated Layout-Height”?我应该如何强制它干净地重新计算?
EN

Stack Overflow用户
提问于 2014-07-31 20:55:54
回答 18查看 99.8K关注 0票数 285

我有一个在iOS 8下运行的UITableView,我正在使用一个故事板中的自动单元格高度。

我的一个单元格包含一个UITextView,我需要它根据用户输入来收缩和扩展-点击以收缩/扩展文本。

为此,我向文本视图添加了一个运行时约束,并更改约束上的常量以响应用户事件:

每当我这样做时,我都会将其包装在tableView更新中并调用[tableView setNeedsUpdateConstraints]

当我这样做的时候,我的单元格确实会扩展(并且在这样做的时候会有动画效果),但是我得到了一个约束警告:

388是我计算的高度,对UITextView的其他约束来自Xcode/IB。

最后一个是困扰我的-我猜测UIView-Encapsulated-Layout-Height是第一次渲染时计算的单元格高度-(我将我的UITextView高度设置为>= 70.0)然而,这个派生约束然后凌驾于更新后的用户约束似乎是不正确的。

更糟糕的是,尽管布局代码说它试图打破我的高度限制,但它并没有-它继续重新计算单元格的高度,然后一切都像我想要的那样绘制。

那么,什么是UIView-Encapsulated-Layout-Height NSLayoutConstraint (我猜它是自动调整单元格大小的计算高度),我应该如何强制它干净地重新计算?

EN

回答 18

Stack Overflow用户

发布于 2014-09-12 03:43:02

尝试将_collapsedtextHeightConstraint的优先级降低到999。这样,系统提供的UIView-Encapsulated-Layout-Height约束始终优先。

它基于您在-tableView:heightForRowAtIndexPath:.中返回的内容确保返回正确的值和您自己的约束,生成的约束应该是相同的。您自己的约束的较低优先级仅在折叠/展开动画正在运行时临时需要,以防止冲突。

另外:虽然系统提供的约束是否正确可能存在争议,但与框架抗争是没有意义的。简单地接受系统约束优先。如果您认为系统约束是错误的,请确保从委托返回正确的rowHeight。

票数 309
EN

Stack Overflow用户

发布于 2014-11-26 19:42:02

我有一个类似的场景:一个只有一个行单元格的表视图,其中有几行UILabel对象。我使用的是iOS 8和自动布局。

当我旋转时,我得到了错误的系统计算的行高(43.5比实际高度小得多)。它看起来是这样的:

这不仅仅是一个警告。我的表格视图单元格的布局很糟糕-所有文本都重叠在一个文本行上。

令我惊讶的是,下面这行代码神奇地“修复”了我的问题(autolayout没有任何问题,我在屏幕上得到了我期望的结果):

使用或不使用此行:

票数 73
EN

Stack Overflow用户

发布于 2019-12-02 17:39:59

在99.9%的情况下,当使用自定义单元格或标题时,所有UITableViews冲突都会在第一次加载表时发生。加载后,通常不会再看到冲突。

这是因为大多数开发人员通常使用固定高度或某种锚点约束来在单元格/标题中布局元素。冲突的发生是因为当UITableView第一次加载/布局时,它将其单元格的高度设置为0。这显然与您自己的约束相冲突。要解决此问题,只需将任何固定高度约束设置为较低的优先级(.defaultHigh)。仔细阅读控制台消息,看看布局系统决定打破哪个约束。通常情况下,这是需要更改其优先级的那个。您可以更改优先级,如下所示:

票数 37
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25059443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档