【问题标题】:How to dynamically set constraints for a custom table view cell?如何为自定义表格视图单元动态设置约束?
【发布时间】:2020-11-26 06:00:22
【问题描述】:

我有一个带有以下约束的自定义表格视图单元格,一个用于UILabel,一个用于UIImageView

var titleLabel = UILabel()
var imageView = UIImageView()

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    addSubview(titleLabel)
    
    setTitlelabelConstraints()
    setImageConstraints()
}

func setTitlelabelConstraints() {
    titleLabel.translatesAutoresizingMaskIntoConstraints = false
    titleLabel.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
    titleLabel.leadingAnchor.constraint(equalTo: imageView.trailingAnchor, constant: 20).isActive = true
    titleLabel.heightAnchor.constraint(equalToConstant: 55).isActive = true
    titleLabel.trailingAnchor.constraint(equalTo: trailingAnchor, constant: -12).isActive = true
}

func setImageConstraints() {
    imageView.translatesAutoresizingMaskIntoConstraints = false
    imageView.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true
    imageView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 12).isActive = true
    imageView.heightAnchor.constraint(equalToConstant: 55).isActive = true
    imageView.widthAnchor.constraint(equalTo: imageView.heightAnchor, multiplier: 16/9).isActive = true
}

如何有条件地将前导锚设置为0,以便在没有图像时,文本标签占据整个单元格?如果没有图像,静态约束当前会留下一个空白空间。

【问题讨论】:

    标签: ios swift uitableview autolayout


    【解决方案1】:

    您可以这样做:将图像视图宽度约束设为小于或等于约束,并添加另一个具有常量 0 和优先级 700 的图像视图宽度约束。

    但是,这并不能真正解决您的问题。毕竟,您仍然会有图像视图和标签之间的间距。 真正的答案在于您自己的话:“静态”。不要让它们成为静态的!根据是否有图像更改约束。毕竟,你知道,对于每个单元格,是否有图像,所以这都是你配置的一部分。

    约束是成熟的对象,因此当您制作图像视图宽度约束和标签前导约束时,请保留对它们的引用,现在您可以在没有图像时将宽度设置为 0 并将间距设置为 0 .

    在此截屏视频中,我所做的只是删除/添加图像并更改常量。我添加动画只是为了好玩,但你当然不会那样做。

    【讨论】:

    • 我想到的是从cellForRowAt 传递一个值到自定义表格视图单元格,告诉单元格是否有图像并相应地设置约束,但唯一的问题是约束在viewDidLoad 中设置,所以我不太确定如何有条件地在viewDidLoad 中部署功能。
    • 但在cellForRowAt 中,您可以配置单元格。你可以做任何你想做的事。正如我刚刚展示的那样,其中一件事就是改变约束。 — 我不知道您对viewDidLoad 中设置的约束是什么意思。一个单元格没有viewDidLoad。您的代码显示约束是在init 中设置的,这很好。我说,很好,所以在cellForRowAt 中更改它们。我告诉过你如何做到这一点;保留对它们的引用,作为实例属性,就像图像视图和标签是实例属性一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    相关资源
    最近更新 更多