Swift UITableViewCell 在 cellForRowAtIndexPath 之后无法设置其约束
Posted
技术标签:
【中文标题】Swift UITableViewCell 在 cellForRowAtIndexPath 之后无法设置其约束【英文标题】:Swift UITableViewCell fails to setup its constraint after cellForRowAtIndexPath 【发布时间】:2018-05-14 10:29:57 【问题描述】:在我的 tableViewController 中,我使用了一个自定义单元格,其中包含一个 imageView、两个标签和一些其他不相关的元素。还有一个约束,如果给定特定条件,则必须更改其常数值。乍一看,这很好用,但是如果我向下滚动并获取约束常数设置为另一个值的单元格,则以下一些单元格会保持该常数与前一个单元格保持一致,并且不要在出现时设置它。
这是我的 cellForRowAtIndexpath 的相关部分:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let identifier = whichCellToShow ? "ThisCell" : "TheOtherCellCell"
//...
let cell = tableView.dequeueReusableCell(withIdentifier: identifier, for: indexPath)
if let customCell = cell as? CustomCellProtocol,
indexPath.section < data.count,
indexPath.row < data[indexPath.section].count
customCell.display(data: data[indexPath.section][indexPath.row])
return cell
这些是我的自定义单元类的相关部分:
class CustomCell: UITableViewCell, CustomCellProtocol
@IBOutlet weak var picture: UIImageView!
@IBOutlet weak var title: UILabel!
@IBOutlet weak var weblink: UILabel!
@IBOutlet weak var titleIndentationConstraint: NSLayoutConstraint!
//...
func display(data: Data)
//...
title.text = data.title
//...
weblink.text = data.hasWeblink ? URLUtilities.hostOfURL(urlstr: data.sourceUrl) : nil
weblink.isHidden = !data.hasWeblink
//This is the spot where things seem to go wrong
titleIndentationConstraint.constant = data.hasWeblink ? weblink.frame.height : 0
setNeedsLayout()
layoutIfNeeded()
如果data.hasWeblink == true
约束常数应该等于weblink标签的高度,如果它是假的应该是0。
我的第一个想法是,UITableView 的视图回收可能会与titleIndentationConstraint.constant = data.hasWeblink ? weblink.frame.height : 0
发生冲突。这就是为什么我之后打电话给setNeedsLayout()
和layoutIfNeeded()
,但这似乎没有帮助。单元格的所有其他元素都正确地完成了它们的工作。
我还在 tableViewController 的 viewDidLoad()
内设置了 tableView.rowHeight
和 tableView.estimatedRowHeight
。
有人知道那里出了什么问题或者我忘了做什么吗?谢谢转发!
【问题讨论】:
您是否在某处停用了约束? @bseh nope,在调试器中也没有收到约束中断警告,但我得到了另一个热门曲目,似乎标题标签的行为很愚蠢 【参考方案1】:自己修好了,不得不更改标题标签的一些约束优先级:
我的标题标签有一个始终大于或等于 8 分的底部约束。此外,我将行数限制为 4,并告诉标签截断文本的尾部,如果它太长而无法显示。有趣的是,如果文本被截断,我就会得到上述这种愚蠢的行为,所以它与我的titleIndetantionConstraint
完全无关。似乎如果文本必须被截断,标签将自身与底部约束对齐,并且有点 拖动 将内容向左居中(所以请注意属性编辑器中 content mode 的内容,默认情况下应保留)。虽然更改标签的内容模式对我来说似乎是个坏主意,但我将标题标签底部约束的 priority 降低了 1,使其与图片顶部对齐,就像我计划的那样。希望这可以帮助人们遇到类似的问题 B)。
【讨论】:
你应该删除问题以上是关于Swift UITableViewCell 在 cellForRowAtIndexPath 之后无法设置其约束的主要内容,如果未能解决你的问题,请参考以下文章
Swift3:UITableViewCell 和 UIButton - 通过单击 UIButton 显示和隐藏 UITableViewCell
Swift:在 UITableViewCell 中异步加载图像 - 自动布局问题
在嵌入在 UITableviewCell 中的 UICollectionView 中进行 Segue,Swift
Swift:选择 UICollectionViewCell(在 UITableViewCell 内)时如何使用 Segue