根据单元格高度在 UITableViewCell 内动态设置 UIImageView 高度

Posted

技术标签:

【中文标题】根据单元格高度在 UITableViewCell 内动态设置 UIImageView 高度【英文标题】:Set UIImageView height dynamically inside UITableViewCell according to cell height 【发布时间】:2020-01-28 14:28:46 【问题描述】:

我对具有 UIImageView 和 UILabel 的 UITableViewCell 有疑问。所有的约束都是以编程方式设置的,这样约束就被调整了,使得cell的高度随着UILabel的高度加上一定的padding而动态变化,而UIImageView必须适应UITableViewCell的高度。但是,当我放置图像时,单元格的高度会增加,直到它是图像的高度。

    contentView.addSubview(coverView)
    contentView.addSubview(indexUnitLabel)

    NSLayoutConstraint.activate([
        coverView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
        coverView.topAnchor.constraint(equalTo: contentView.topAnchor),
        coverView.bottomAnchor.constraint(equalTo: contentView.leadingAnchor),
        coverView.widthAnchor.constraint(equalToConstant: 68),

        titleLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: padding),
        titleLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -padding),
        titleLabel.leadingAnchor.constraint(equalTo: coverView.trailingAnchor, constant: padding),
        titleLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -padding)
    ])

有没有办法设置约束,让 UIImageView 的高度动态适应单元格的高度?

【问题讨论】:

【参考方案1】:

我假设您重新输入了代码(而不是粘贴实际代码),因为您的 coverView.bottomAnchor 也等于 contentView.leadingAnchorindexUnitLabel 添加为子视图,然后尝试约束titleLabel...

所以,你的约束应该是这样的:

    NSLayoutConstraint.activate([
        coverView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
        coverView.topAnchor.constraint(equalTo: contentView.topAnchor),
        coverView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor),
        coverView.widthAnchor.constraint(equalToConstant: 68),

        indexUnitLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: padding),
        indexUnitLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -padding),
        indexUnitLabel.leadingAnchor.constraint(equalTo: coverView.trailingAnchor, constant: padding),
        indexUnitLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -padding)
    ])

但是...,它没有为自动布局提供足够的信息来说明您想要对单元格的高度进行什么操作。

你说你希望标签高度(加上填充)来确定单元格的高度,所以添加这一行:

indexUnitLabel.setContentHuggingPriority(.required, for: .vertical)

这告诉自动布局将标签的高度扩展到其内容之外。

【讨论】:

【参考方案2】:

不要从contentView 对您的coverView 进行约束,而是从coverView 将其约束到titleLabel。相应地调整填充。还将translatesAutoresizingMaskIntoConstraints 设置为false。

  titleLabel.translatesAutoresizingMaskIntoConstraints = false
  coverView.translatesAutoresizingMaskIntoConstraints = false

  titleLabel.topAnchor.constraint(equalTo: contentView.topAnchor, constant: padding),
  titleLabel.bottomAnchor.constraint(equalTo: contentView.bottomAnchor, constant: -padding),
  titleLabel.leadingAnchor.constraint(equalTo: coverView.trailingAnchor, constant: padding),
  titleLabel.trailingAnchor.constraint(equalTo: contentView.trailingAnchor, constant: -padding)

  coverView.topAnchor.constraint(equalTo: titleLabel.topAnchor, constant: padding),
  coverView.bottomAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: -padding),
  coverView.leadingAnchor.constraint(equalTo: titleLabel.trailingAnchor, constant: padding),
  coverView.trailingAnchor.constraint(equalTo: titleLabel.trailingAnchor, constant: -padding)

【讨论】:

没用。在设置图像上,UIImageView 高度增加,UILabel 高度也增加。

以上是关于根据单元格高度在 UITableViewCell 内动态设置 UIImageView 高度的主要内容,如果未能解决你的问题,请参考以下文章

根据视图更改自定义 UITableViewCell 高度

iOS 中包含 UIWebView 的单元格的动态 UITableViewCell 高度

根据内容自动调整 UITableViewCell 高度

带有 UIWebview 的 UITableViewCell,可根据内容大小调整高度

更改 UITableViewCell 内 UIView 的高度(故事板)

在 iOS 7 中根据单元格的文本计算单元格高度