gpt4 book ai didi

ios - UITableViewCell 通过内容拥抱自动调整大小

转载 作者:行者123 更新时间:2023-11-29 10:26:12 24 4
gpt4 key购买 nike

我想要实现的是在其中包含 UILabel 的情况下自动调整单元格大小。在我开始拥抱部分之前,我能够让它发挥作用。我所说的拥抱是指如果文本真的很短,则让 UILabel 尽可能小。

我准备了一个非常简单的问题示例:

http://s000.tinyupload.com/index.php?file_id=11087347944522931899

在我将尾随约束设置为“500”优先级(低于 hugging,即 750)之后,一切都很好。现在看来,调整单元格正在减小 UILabel 的尺寸,但从未增加,所有高度计算都是错误的。

在第一个真正短的单元格进来之后——所有在这个单元格坏了之后:

problem

通过调试,我发现一旦 UILabel 达到 8px,它就会变大,所有高度计算都是针对 8px 宽度完成的。

我找到了解决方法,并在单元格因任何原因出队后重置 preferredWidth 有帮助,但我不确定是否有更好的方法来解决该问题。

我的解决方法是在附加项目(第 55 行、第 81 行)ChatTableController.m 中发表评论,我正在为此寻找合适的解决方案。

最佳答案

首先,将标签上的尾随约束设置为 >=20。这让标签缩小。

你真正的问题是这个方法:

- (void)setBounds:(CGRect)bounds {
[super setBounds:bounds];

if (self.numberOfLines == 0 && bounds.size.width != self.preferredMaxLayoutWidth) {
self.preferredMaxLayoutWidth = self.bounds.size.width;
[self setNeedsUpdateConstraints];
}
}

heightForRowAtIndexPathcellForRowAtIndexPath 中创建单元格时,最好设置 cell.theLabel.preferedMaxLayoutWidth

如果您完全注释掉这段代码,它似乎一切正常。

如果每次调用 heightForRowAtIndexPath 时创建一个新的原型(prototype)单元格,您也可以使您的代码正常工作。这就是促使我实现上述功能的原因。

似乎每次调用 heightForRowAtIndexPath 时,原型(prototype)单元格的重用都会导致高度的组合增加。如果您向下滚动并向上滚动,您会看到这个。

所以我会完全删除此方法,让约束为您完成工作。我看到当一行达到精确大小时单元格会收缩,而其他所有内容都很紧凑。

在 createCellForRowAtIndexPath 中设置文本之前,添加以下内容以使布局宽度全屏减去 20 个边距:

cell.messageLabel.preferredMaxLayoutWidth=self.view.bounds.size.width-40;

在 heightForRowAtIndexPath 的原型(prototype)单元格中设置文本之前:

prototypeCell.messageLabel.preferredMaxLayoutWidth=self.view.bounds.size.width-40;

设置preferredMaxLayoutWidth会导致旋转出现问题。每个单元格设置这个意味着每个单元格现在都有特定于方向的约束。为了解决这个问题,您必须通过将以下内容添加到 View Controller 来重新加载旋转表:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
[self.tableView reloadData];
}

最终结果:

enter image description here

关于ios - UITableViewCell 通过内容拥抱自动调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32143597/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com