根据标签文本动态改变单元格高度

Posted

技术标签:

【中文标题】根据标签文本动态改变单元格高度【英文标题】:Dynamically change cell height according to label text 【发布时间】:2019-09-04 15:31:20 【问题描述】:

我尝试为我的应用程序添加问答部分,并且 tableview 单元格必须根据文本高度扩展,单元格高度必须随此文本而变化。在这一点上,我做了一些事情来解决 numberOfline = 0 和 UITableView.automaticDimension 代码无法解决我的问题的问题。这是我的项目代码:

问题是单元格高度没有更改此代码,只需在问题下方写标签,并在下一个问题下获得更长的答案。意味着单元格高度没有改变。

let soruLabel: UILabel = 
    let sorulabel = UILabel()
    sorulabel.textColor = .darkGray
    sorulabel.numberOfLines = 0
    sorulabel.font = UIFont.boldSystemFont(ofSize: 17)
    return sorulabel
()

let cevapLabel: UILabel = 
    let cevaplabel = UILabel()
    cevaplabel.textColor = .black
    cevaplabel.numberOfLines = 0
    cevaplabel.font = UIFont(name: "HelveticaNeue", size: 18)
    return cevaplabel
()

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) 
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    setup()


func set(content: expandingTableCellForsss) 
    self.soruLabel.text = content.soru
    self.cevapLabel.text = content.expanded ? content.cevap : ""


func setup() 
    backgroundColor = UIColor.init(red: 245, green: 245, blue: 245, alpha: 1)


    addSubview(soruLabel)
    addSubview(cevapLabel)


    soruLabel.translatesAutoresizingMaskIntoConstraints = false
    soruLabel.topAnchor.constraint(equalTo: topAnchor).isActive = true
    soruLabel.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
    soruLabel.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = false
    soruLabel.rightAnchor.constraint(equalTo: rightAnchor).isActive = true

    cevapLabel.translatesAutoresizingMaskIntoConstraints = false
    cevapLabel.topAnchor.constraint(equalTo: soruLabel.bottomAnchor).isActive = true
    cevapLabel.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
    cevapLabel.bottomAnchor.constraint(equalTo: soruLabel.bottomAnchor).isActive = false
    cevapLabel.rightAnchor.constraint(equalTo: rightAnchor).isActive = true






required init?(coder aDecoder: NSCoder) 
    fatalError("init(coder:) has not been implemented")

【问题讨论】:

要使用 UITableView.automaticDimension 你还需要设置estimatedHeightForRowAt 检查cevapLabel的底部约束,它没有连接到容器视图的底部。以防万一还要检查内容拥抱优先级。 cevapLabel底部锚不应该等于bottomAnchor并且激活吗?具体来说:cevapLabel.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true? @DavidSteppenbeckPhD 非常感谢您解决了我的问题。 @eksglox 没问题,我将其添加为答案,以便其他用户可以轻松找到它。如果对您有用,请标记为已接受。 【参考方案1】:

需要设置底部锚点:

cevapLabel.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true

【讨论】:

【参考方案2】:

请检查: UITableViewCell auto height based on amount of UILabel text,

Using Auto Layout in UITableView for dynamic cell layouts & variable row heights

要使用动态单元格高度: 1) 给出 viewDidLoad 中单元格的最小行高

tableView.estimatedRowHeight = 300

2) 在viewDidLoad中设置tableview的rowHeight属性为自动

tableView.rowHeight = UITableViewAutomaticDimension

3) 在情节提要中选择 numberOfLines = 0

4) 如果您为故事板中的单元格提供了自定义高度,请确保其等于估计的行高。

【讨论】:

以上是关于根据标签文本动态改变单元格高度的主要内容,如果未能解决你的问题,请参考以下文章

如何根据标签文本快速更改表格视图单元格高度?

根据内容动态调整tableview单元格的高度 - iOS Swift

单元格中的标签高度不会动态改变高度

动态单元格高度的自动布局约束

iOS8“现在”改变动态单元格的高度,重新内部单元格内容

带有图像视图和标签的 iOS UITableViewCell 动态大小的表格视图单元格