swift中 UITableViewCell高度是自适应的, cell里面有个多行显示的UILabel,SnapKit下,这个UILabel距离父视图contentView的top和left和right 为0 ,高度为根据字符串自适应。其底部有个ImageView,image当外部传入到这个ImageView上。如果没有image ,UILabel的高度为cell的高度,距离父视图contentView的bottom为0,如果有图片mage,那UILabel的底部距离ImageView的顶部为10,ImageView 距离父视图contentView的bottom和left和right 为0,高度为100,这个怎么写?
时间: 2024-03-01 11:56:22 浏览: 142
您可以使用以下代码实现:
```swift
class CustomTableViewCell: UITableViewCell {
private let label = UILabel()
private let imageView = UIImageView()
private let labelToImageSpacing: CGFloat = 10
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
contentView.addSubview(label)
label.snp.makeConstraints { make in
make.top.left.right.equalToSuperview()
}
contentView.addSubview(imageView)
imageView.snp.makeConstraints { make in
make.left.bottom.right.equalToSuperview()
make.height.equalTo(0)
}
}
func configure(with text: String?, image: UIImage?) {
label.text = text
label.numberOfLines = 0
label.sizeToFit()
if let image = image {
imageView.image = image
imageView.snp.updateConstraints { make in
make.top.equalTo(label.snp.bottom).offset(labelToImageSpacing)
make.height.equalTo(100)
}
} else {
imageView.image = nil
imageView.snp.updateConstraints { make in
make.top.equalTo(label.snp.bottom)
make.height.equalTo(0)
}
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
override func setHighlighted(_ highlighted: Bool, animated: Bool) {
super.setHighlighted(highlighted, animated: animated)
}
}
```
在 `CustomTableViewCell` 中,我们使用 `SnapKit` 将 `label` 和 `imageView` 添加到 `contentView` 中,并设置它们的约束。通过 `configure` 方法,我们可以根据是否有 `image` 来更新 `imageView` 的约束和内容。如果没有 `image`,我们将 `imageView` 的高度设置为 0,将 `imageView` 的约束更新为和 `label` 底部对齐,否则我们将 `imageView` 的高度设置为 100,将 `imageView` 的约束更新为距离 `label` 底部 10 的位置。这样,当我们调用 `configure` 方法时,`label` 和 `imageView` 的约束会自动适应内容。
阅读全文