自我调整 UITableViewCell 变小

Posted

技术标签:

【中文标题】自我调整 UITableViewCell 变小【英文标题】:self sizing UITableViewCell goes small 【发布时间】:2018-03-28 13:58:00 【问题描述】:

我正在尝试以编程方式创建一个表格视图单元原型(类似于下面的原型)。

设计有两个堆栈视图的单元格, a) 一个垂直堆栈视图,包含文本标签, b) 水平堆栈视图包含图像视图和垂直堆栈视图

我创建所需的视图,将其填充到堆栈视图中,并在 tableviewcell 的 init() 中将堆栈视图固定到表格单元格的 contentView。

我从 cellForItemAtIndexPath 调用 configureCell() 来填充单元格的数据。

我的 init() 看起来像这样

override init(style: UITableViewCellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)

    textStackView = UIStackView(arrangedSubviews: [priorityNameLabel, descriptionLabel])
    textStackView.axis = .vertical
    textStackView.alignment = .leading
    textStackView.distribution = .fill
    textStackView.spacing = 5

    containerStackView = UIStackView(arrangedSubviews: [priorityImageView, textStackView])
    containerStackView.axis = .horizontal
    containerStackView.alignment = .center
    containerStackView.spacing = 5
    containerStackView.distribution = .fill

    contentView.addSubview(containerStackView)
    containerStackView.translatesAutoresizingMaskIntoConstraints = false
    pinContainerToSuperview()


func pinContainerToSuperview() 
    containerStackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).activate()
    containerStackView.topAnchor.constraint(equalTo: contentView.topAnchor).activate()
    containerStackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor).activate()
    containerStackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).activate()

在我的视图控制器中,我将 tableView rowHeight 设置为 automaticDimension 并将估计高度设置为大约。价值。当我运行代码时,我得到的只是,

图像顶部的窄水平线是我的表格视图单元格(在这种情况下我的数据计数为 3)。我无法弄清楚问题所在。有人可以指出这里出了什么问题吗?

编辑 1:

这些是我的 TableViewCell 类的实例成员

var containerStackView: UIStackView!
var textStackView: UIStackView!

var priorityImageView: UIImageView! 
    let imageView = UIImageView()
    imageView.contentMode = .scaleAspectFit
    return imageView


var priorityNameLabel: UILabel! 
    let label = UILabel()
    return label


var descriptionLabel: UILabel! 
    let label = UILabel()
    return label

【问题讨论】:

我在你的代码中看不到你在哪里以及如何创建标签和图像视图 - 你能添加那部分吗? 您没有为标签/多行文本/图像/堆栈视图指定任何最小高度。这就是为什么单元格没有得到任何高度并缩小的原因。您可以通过故事板/代码设置 >= 高度约束来解决问题。 如果单元格只是三个视图对象,为什么需要将它们放入堆栈? @Losiowaty 添加了表格单元格的实例成员。 @slickdaddy 我选择 stackView 是为了减少设计所需的约束数量。 【参考方案1】:

您将标签和图像视图作为计算属性 - 这意味着每次访问它们时都会创建一个新实例。这是不好的。这基本上意味着,当您将它们设置为堆栈视图的排列子视图,然后尝试稍后配置它们时,您将处理不同的对象。

最简单的解决方案是按照在 init 中创建堆栈视图的方式创建标签和图像视图。

【讨论】:

成功了。谢谢!!这也是有道理的。惰性属性怎么样?说我愿意,懒惰的 var lbl: UILabel = return UILabel() 。这是否也会在我每次访问时创建 UILabel 实例? 不,懒惰在这里可以工作,只是没有必要。一般来说,惰性应该用于创建成本高且不太可能使用的属性。与往常一样 - 文档中有更多内容 - developer.apple.com/library/content/documentation/Swift/…

以上是关于自我调整 UITableViewCell 变小的主要内容,如果未能解决你的问题,请参考以下文章

unity的ui文字打包后变小了

具有三个 UILabel 的自我调整大小的单元格不起作用

React Material-UI无法调整表格大小

如何在其中使用UIStackView自定义UITableViewCell的大小

UITextView 文本空间在调整大小时变小

pdf文件太大怎么变小如何调整