gpt4 book ai didi

swift - UILabel PreferredMaxLayout 破坏自调整单元格大小

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

我发现 UILabel 无法与 AutoLayout 一起使用时出现了一些非常烦人的问题。

我发现了多个与此相关的线程,但没有一个解决方案适合我。

class AudiosHeaderCell: CollectionViewCell<AudiosHeaderItemViewModel> {
var label: UILabelPreferedWidth? {
didSet {
self.label?.textAlignment = .center
self.label?.numberOfLines = 0
self.label?.lineBreakMode = .byWordWrapping
self.label?.font = Font.Standard.size14
self.label?.textColor = UIColor(netHex: 0x185B97)
}
}
let labelLeftRightMargin = CGFloat(16)

override func setupViews() {
self.backgroundColor = UIColor.white

self.label = UILabelPreferedWidth()
self.contentView.addSubview(self.label!)
}

override func setupConstraints() {
self.label?.snp.makeConstraints { (make) in
make.edges.equalToSuperview().inset(UIEdgeInsets(top: 8, left: labelLeftRightMargin, bottom: 8, right: labelLeftRightMargin))
}
}

override func bindViewModel(viewModel: AudiosHeaderItemViewModel) {
self.label?.text = viewModel.text
}
}

class UILabelPreferedWidth : UILabel {
override var bounds: CGRect {
didSet {
print("SET BOUNDS", bounds)
if (bounds.size.width != oldValue.size.width) {
self.setNeedsUpdateConstraints()
}
}
}

override func updateConstraints() {
print("updateConstraints", preferredMaxLayoutWidth, bounds)
if(preferredMaxLayoutWidth != bounds.size.width) {
preferredMaxLayoutWidth = bounds.size.width
}
super.updateConstraints()
}
}

我使用一种方法来计算单元格的大小,如下所示:

func sizeForCellWithViewModel(_ viewModel: IReusableViewModel, fittingSize: CGSize) -> CGSize {
let cell = self.classRegistry.instances[viewModel.reuseIdentifier]!
(cell as! ICollectionViewCell).setViewModel(viewModel)
cell.translatesAutoresizingMaskIntoConstraints = false
cell.contentView.translatesAutoresizingMaskIntoConstraints = false
cell.frame = CGRect(x: 0, y: 0, width: fittingSize.width, height: fittingSize.height)
cell.setNeedsLayout()
cell.layoutIfNeeded()

print("SIZE FOR ", cell, "FITTING ", fittingSize, "IS", cell.systemLayoutSizeFitting(fittingSize))

return cell.systemLayoutSizeFitting(fittingSize)
}

它适用于具有一些图像和其他内容的多个单元格,但在缩放到 UILabel 内容等简单问题上却失败了。

我遇到的问题是 systemLayoutSizeFitting.width 返回的尺寸大于我传递的 fittingSize.width 参数。

我已经调试了很长时间,我发现 preferredMaxLayoutWidth 没有正确更新,因为此 UILabel 的边界超出了单元格框架 - 尽管我在那里使用了约束。

有人有好的解决方案吗?

我发现的唯一一个是在 CollectionViewCell 上使用它:

override var frame: CGRect {
didSet {
self.label?.preferredMaxLayoutWidth = self.frame.size.width - 32
}
}

但我讨厌它,因为它迫使我将其与约束同步,并且应用程序中的所有其他用例都需要记住复制它。我正在寻找的是自动布局,仅约束解决方案。

最佳答案

通过向 Cell 的 contentView 添加宽度约束解决了问题:

func sizeForCellWithViewModel(_ viewModel: IReusableViewModel, fittingSize: CGSize) -> CGSize {
let cell = self.classRegistry.instances[viewModel.reuseIdentifier]!
(cell as! ICollectionViewCell).setViewModel(viewModel)
cell.contentView.frame = CGRect(x: 0, y: 0, width: fittingSize.width, height: fittingSize.height)
cell.contentView.snp.removeConstraints()
if fittingSize.width != 0 {
cell.contentView.snp.makeConstraints { (make) in
make.width.lessThanOrEqualTo(fittingSize.width)
}
}
if fittingSize.height != 0 {
cell.contentView.snp.makeConstraints({ (make) in
make.height.lessThanOrEqualTo(fittingSize.height)
})
}
cell.contentView.setNeedsLayout()
cell.contentView.layoutIfNeeded()
return cell.contentView.systemLayoutSizeFitting(fittingSize)
}

似乎这以某种方式使 UILabel 工作并且 PreferredWidth 不会变得疯狂。

关于swift - UILabel PreferredMaxLayout 破坏自调整单元格大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44135170/

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