字幕单元格的 Swift 自动行高

Posted

技术标签:

【中文标题】字幕单元格的 Swift 自动行高【英文标题】:Swift Automatic Row Height for Subtitle Cell 【发布时间】:2017-01-02 05:17:31 【问题描述】:

我在 UITableView 中使用了一个字幕单元格。我在viewDidLoad 中设置了以下内容,以使行高自动扩展:

    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 100

我还将单元格的标题和副标题设置为自动换行:

    cell.textLabel?.numberOfLines = 0
    cell.textLabel?.lineBreakMode = .byWordWrapping

    cell.detailTextLabel?.numberOfLines = 0
    cell.detailTextLabel?.lineBreakMode = .byWordWrapping

当我输入标题时,一切都很好。但副标题不会扩展行。我还需要做些什么来让字幕增加行高吗?

【问题讨论】:

如果你使用标准的“subtitle”样式的表格视图单元格,你会遇到这个问题:***.com/questions/36587126/…你可以覆盖systemLayoutSizeFittingSize:withHorizontalFittingPriority:verticalFittingPriority:函数或者设置一个带有约束的自定义样式单元格(和连接标签而不是 textLabel 和 detailTextLabel) 【参考方案1】:

您应该使用一个标签并像这样给出约束,

之后,编写tableview的这两个委托方法。

func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat 
    return UITableViewAutomaticDimension

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 
    return UITableViewAutomaticDimension

所以,tableview 的高度随着标签文本大小的增加而增加。

【讨论】:

这是最好的答案【参考方案2】:

通过使用来自https://***.com/a/40168001/4045472 的代码并将单元格定义为:

class MyTableViewCell: UITableViewCell 

    override func systemLayoutSizeFitting(_ targetSize: CGSize, withHorizontalFittingPriority horizontalFittingPriority: UILayoutPriority, verticalFittingPriority: UILayoutPriority) -> CGSize 

        self.layoutIfNeeded()
        var size = super.systemLayoutSizeFitting(targetSize, withHorizontalFittingPriority: horizontalFittingPriority, verticalFittingPriority: verticalFittingPriority)

        if let textLabel = self.textLabel, let detailTextLabel = self.detailTextLabel 
            let detailHeight = detailTextLabel.frame.size.height
            if detailTextLabel.frame.origin.x > textLabel.frame.origin.x  // style = Value1 or Value2
                let textHeight = textLabel.frame.size.height
                if (detailHeight > textHeight) 
                    size.height += detailHeight - textHeight
                
             else  // style = Subtitle, so always add subtitle height
                size.height += detailHeight
            
        

        return size

    


将故事板中的单元格自定义类更改为 MyTableViewCell 将自动设置正确的大小。

在表格视图数据源的tableView:cellForRow:函数中,设置标签文本后,调用cell.setNeedsLayout()强制调整布局。

【讨论】:

其他答案只处理正在工作的主标题更改,但这确实在副标题更改时增加了行高。谢谢!【参考方案3】:

您需要设置约束,以便单元格可以根据标签的大小自动调整大小。这是关于动态单元格的教程。 https://www.raywenderlich.com/129059/self-sizing-table-view-cells

【讨论】:

以上是关于字幕单元格的 Swift 自动行高的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableView 中使用自动布局进行动态单元格布局和可变行高

Swift UITableView didSelectRowAtIndexPath 错误

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

单元格的 detailTextLabel 未在 swift 3 中显示

DataGridView使用技巧五:自动设定列宽和行高

怎样根据内容自动调整excel表格的行高列宽?