自动调整大小UITableViewCell没有自动布局

时间:2018-04-01 18:32:49

标签: ios swift uitableview

我正在尝试创建一个自我调整大小UITableView,但不想使用自动布局来布局它的子视图。

有没有办法做到这一点? 我正在设置

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 40

但是在self.frame.size.height中调整layoutSubviews没有帮助,单元格保持在40高度,所以我假设我需要以不同的方法返回实际高度。对于UICollectionViewCells,方法是

override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes

但我找不到UITableViewCell的等价物。

感谢您的任何指示。

4 个答案:

答案 0 :(得分:2)

你不能在没有自动布局的情况下创建动态高度tableViewCell,实际上当你将这个UITableViewAutomaticDimension传递给tableView的rowHeight它时

1- heightForCellAtRow中指定的返回高度(如果已实施)

2-从Xib返回正确的高度,或者如果您在代码中创建了约束

3-如果无效,则返回40(默认值)

答案 1 :(得分:0)

在没有自动布局的情况下实现自定义UITableViewCell,您必须自己计算大小并将其返回sizeForRowAtIndexPath:

class Cell: UITableViewCell {
    ...
    func getCellHeight() -> CGFloat {
        // calculate height yourself
    }
    ...
}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    guard let cell = tableView.cellForRow(at: indexPath) as? Cell else { return defaultHeight }
    return cell.getCellHeight
}

或者您可以覆盖sizeToFit()sizeThatFits(size: CGSize)来计算您的预期身高,并在需要时调用这些方法。

答案 2 :(得分:0)

这实际上是可行的,而且这是一种非常好的方法,无需自动布局(如果您想在 TableView 上平滑滚动)。

您可以通过使用 sizeThatFits(_ size: CGRect) 方法通过考虑单元格内的所有视图/填充来计算单元格的大小来实现这一点。然后,您必须像自己一样使用 autoDimension rowHight 来让 TableView 知道这一点,但也要使用 func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat 方法:

UITableView 设置:

tableView.rowHeight = UITableView.automaticDimension
tableView.estimatedRowHeight = UITableView.automaticDimension

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableView.automaticDimension
}

请记住,如果您的单元格中有带有动态文本的标签,则需要在 sizeThatFits(_ size: CGRect) 方法中设置文本并从那里计算标签高度。

UITableViewCell:

    let cellLabel = UILabel()
    var labelText: String?
    private let padding: CGFloat = 8

    override func sizeThatFits(_ size: CGSize) -> CGSize {
        guard let text = self.labelText else { return .zero } // You might not need this

        let superHeight = super.sizeThatFits(size).height
        let verticalPadding = padding * 2

        descriptionLabel.text = text
        descriptionLabel.font = UIFont.rpx.regular14

        let labelHeight = labelHeight.text?.boundingRect(
            with: CGSize(width: size.width, height: size.height),
            options: .usesLineFragmentOrigin,
            context: nil
        ).size.height ?? size.height

        return CGSize(width: size.width, height: superHeight + labelHeight + verticalPadding)
    }

答案 3 :(得分:-2)

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
{
let maxLabelWidth:CGFloat = tableView.frame.width
let title = UILabel()
label.numberOfLines = 0
let titleFont = [NSFontAttributeName: UIFont(name: "OpenSans", size: 10.0)! ]
let titleStr = "test Str" // update with your title string from Array
label.attributedText = NSMutableAttributedString(string: titleStr , attributes: titleFont)
let updatedSize:CGSize = title.sizeThatFits(CGSizeMake(maxLabelWidth, CGFloat.max))
let updatedHeight = updatedSize.height
return updatedHeight
}