繁体   English   中英

NSLayoutConstraint中断

[英]NSLayoutConstraint breaks

我有一个自定义的UITableViewCell。 该单元格具有三个标签。 最左侧的“金额”标签具有以下约束。

在单元格的右侧,我还有另一个标签“ Label Dollar Amount”。 它具有以下约束:

“标签美元金额”正下方的第三个标签是“标签最大金额”。 约束如下: 在此处输入图片说明

代码上什么也没做。 表格行高是使用UITableViewAutomaticDimension计算的。 估计的行高设置为100。

当视图处于横向且TableView向下滚动时,由于该特定单元格不在可见视图范围内,因此将其从队列中取出。 对于相同状态,当方向更改为纵向时,该单元格将可见。

我收到以下错误:

 Probably at least one of the constraints in the following list is one you don't want. Try this: (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 and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
NSLayoutConstraint:0x1607a770 H:[UILabel:0x160c1990'Amount'(150)],
NSLayoutConstraint:0x160c2b30 H:|-(18)-[UILabel:0x160c1990'Amount']   (Names: '|':UITableViewCellContentView:0x160c18c0 ),
NSLayoutConstraint:0x160c2b90 H:[UILabel:0x160c1990'Amount']-(0)-[UILabel:0x160c1c40'$45.61'],
NSLayoutConstraint:0x160c2bf0 UILabel:0x160c1ac0'(Max: $1,000.00)'.leading == UILabel:0x160c1c40'$45.61'.leading,
NSLayoutConstraint:0x160c2c80 H:[UILabel:0x160c1ac0'(Max: $1,000.00)']-(12)-|   (Names: '|':UITableViewCellContentView:0x160c18c0 ),
NSLayoutConstraint:0x14e179e0 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x160c18c0(72)]
)

Will attempt to recover by breaking constraint 
NSLayoutConstraint:0x1607a770 H:[UILabel:0x160c1990'Amount'(150)]`

注意:对于此处看到的所有可能的约束,优先级都设置为1000(必需)。

如果将“数量”标签上的宽度约束的优先级更改为999,则它可以工作。 但是标签消失了,显示了更长的文字。 由于尾随约束中的零间距具有较高的优先级。 关于可能出了什么问题的任何建议?

表格在单元格视图上设置了72点的固定宽度。 当它适应新的方向或布局时,这可能只是暂时的,但是您需要适应它:

NSLayoutConstraint:0x14e179e0 'UIView-Encapsulated-Layout-Width' H:[UITableViewCellContentView:0x160c18c0(72)]

因此,当其预览仅宽72点时,您需要确定布局中应发生的情况。

当前,您具有以下内容(进行了一些编辑以使内容更清楚):

H:|-(18)-[UILabel:0x160c1990'Amount']   (Names: '|':UITableViewCellContentView:0x160c18c0 ),
H:[UILabel:0x160c1990'Amount'(150)],
H:[UILabel:0x160c1990'Amount']-(0)-[UILabel:0x160c1c40'$45.61'],
UILabel:0x160c1ac0'(Max: $1,000.00)'.leading == UILabel:0x160c1c40'$45.61'.leading,
H:[UILabel:0x160c1ac0'(Max: $1,000.00)']-(12)-|   (Names: '|':UITableViewCellContentView:0x160c18c0 ),

要么:

H:|-(18)-[Amount(150)][Max]-(12)-|

因此,即使每个可以折叠为0宽度的视图都一样,您仍然需要18 + 150 + 12 == 180个超级视图边缘之间的宽度。 这与可用的72点冲突。

您希望如何解决? 正如您提到的,一种可能性是降低“金额”标签上宽度约束的优先级。 或者,您甚至可以完全消除此约束,而依赖于固有宽度和抗压优先级。 您说“对于较长的文本,标签消失了。因为尾随约束中的零间距具有较高的优先级。” 我不确定您的意思。 也许使用更长的文本时,标签会自动换行,而单词会出现在看不见的第二行? 如果是这样,您可以将其设置为截断(尽管这是默认设置)。 如果连截断都不可接受,那应该怎么办?

您可以尝试设置adjustsFontSizeToFitWidthminimumScaleFactor来允许标签中的文本缩小,但是最终您仍然会达到限制(如果文本足够长且单元格宽度足够窄),因此您仍然需要决定要发生。

另一种方法是降低“标签最大数量”和超级视图之间的尾随约束的优先级,以使该标签从右侧移出。 您可能还需要降低标签美元金额尾随约束的优先级,因为它对布局施加了相同的要求。

但是,当然,这意味着您的某些内容不在屏幕上。 只有这样的事实,即您必须确定宽度太小而无法容纳所有内容时应该丢失的内容。

一旦确定应该发生什么,就可以确定实现该目标的优先级。 例如,如果要首先截断“最大量”,则将其抗压缩性设置为最低。 如果您希望下一个美元金额被截断,则将其压缩率设置为第二低。 如果要在此之后截断“数量”标签,则将其宽度限制(或压缩阻力,如果您摆脱了宽度限制)设置为第三低。 而且,如果您希望将事物从右侧移出,作为最后的选择,请将尾随到超级视图约束的优先级设置为999。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM