0

我有一个自定义的 UITableViewCell,我希望它根据我的标签文本内容更新高度。
但我尝试在我的 ViewController ViewDidLoad 中使用此代码:

  tableView.register(ChatRightTextTableViewCell.self, forCellReuseIdentifier: ChatRightTextTableViewCell.identifier)
  tableView.estimatedRowHeight = 100.0
  tableView.rowHeight = UITableViewAutomaticDimension


它似乎没有更新高度。
我的细胞限制有什么问题?
谢谢。

![像这样的单元格约束错误。

import snapKit
import UIKit

class ChatRightTextTableViewCell: UITableViewCell {

static let identifier = "ChatRightTextTableViewCell"
var cellHeight: CGFloat = 0

var labelContent:UILabel = { ()->UILabel in
    let ui:UILabel = GeneratorLabel()
    ui.textColor = UIColor(red:0.20, green:0.20, blue:0.20, alpha:1.00)
    ui.backgroundColor = UIColor.white
    ui.font = defaultTextFont
    ui.numberOfLines = 0
    ui.lineBreakMode = NSLineBreakMode.byCharWrapping
    ui.layer.cornerRadius = defaultButtonRadius
    ui.layer.masksToBounds = true
    return ui
}()

var labelDatetime:UILabel = { ()->UILabel in
    let ui = GeneratorLabel()
    ui.font = defaultMessageTimeFont
    ui.textColor = defaultChatTimeColor
    ui.numberOfLines = 0
    return ui
}()

var icon:UIImageView = { ()->UIImageView in
    let ui = GeneratorAvatarImageView()
    ui.isUserInteractionEnabled = true
    return ui
}()

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

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}

override func layoutSubviews() {
    super.layoutSubviews()
    loadVFL()
}

override func awakeFromNib() {
    super.awakeFromNib()
}

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}


func loadContent() {
    backgroundColor = defaultBackgroundColor
    selectionStyle = .none
    contentView.addSubview(labelContent)
    contentView.addSubview(labelDatetime)
    contentView.addSubview(icon)
}

func loadVFL() {

    let datetimeHeight:CGFloat = UIScreen.main.bounds.height*0.0195 //13

    let contentWidth:CGFloat = contentView.bounds.width*0.62  //254.5
    let iconLeftPadding:CGFloat = contentView.bounds.width*0.0266 //15
    let contentAndDatePadding:CGFloat = UIScreen.main.bounds.height*0.0089 //6
    let dateAndBottomPaddding:CGFloat = UIScreen.main.bounds.height*0.0090 //6
    let topPadding:CGFloat            = UIScreen.main.bounds.height*0.0149 //10
    let nameLabelBottomPadding:CGFloat = UIScreen.main.bounds.height*0.0075 //5

    let views = DictionaryOfInstanceVariables(self, objects: "labelContent","labelDatetime","icon")
    let metrics = ["padding":iconLeftPadding,"contentAndDatePadding":contentAndDatePadding,"dateAndBottomPaddding":dateAndBottomPaddding,"nameLabelBottomPadding":nameLabelBottomPadding,"topPadding":topPadding]

    labelContent.frame = CGRect(x: 0, y: 0, width: contentWidth, height: CGFloat.greatestFiniteMagnitude)
    labelContent.sizeToFit()

    icon.snp.makeConstraints { (make) -> Void in
        make.width.equalTo(defaultChatroomIconWidth)
        make.height.equalTo(defaultChatroomIconWidth)
        make.centerY.equalToSuperview()
    }

    labelDatetime.snp.makeConstraints { (make) in
        make.height.equalTo(datetimeHeight)
    }

    labelContent.backgroundColor = UIColor.red
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[labelContent]-padding-[icon]-padding-|", options: [], metrics: metrics, views: views))
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[labelDatetime]-padding-[icon]-padding-|", options: [], metrics: metrics, views: views))
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-topPadding-[labelContent]-contentAndDatePadding-[labelDatetime]-dateAndBottomPaddding-|", options: [], metrics: metrics, views: views))
    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-topPadding-[icon]", options: [], metrics: metrics, views: views))
}
}
4

3 回答 3

1

明白了,

如果您使用过 xib,您会注意到警告,因为您已经对其进行了编码并放置了标签,这很难猜出问题:)

您正在使用两个标签,它们基本上根据它们显示的内容决定单元格的高度。但是由于两者在垂直轴上都具有相同的内容拥抱优先级,因此仅对这些标签提供顶部和底部约束是不够的。

您必须将垂直轴上的内容拥抱优先级设置为标签之一(您认为显然会有较小的内容)以提供足够的数据来计算单元格的动态高度。

概括 :

简单设置

labelDatetime.setContentHuggingPriority(252, for: .vertical)

或者

var labelDatetime:UILabel = { ()->UILabel in
let ui = GeneratorLabel()
ui.font = defaultMessageTimeFont
ui.textColor = defaultChatTimeColor
ui.numberOfLines = 0
ui..setContentHuggingPriority(252, for: .vertical)
return ui
}()
于 2017-07-10T07:16:45.107 回答
0

如果您使用的是 xib,自动布局通常会提供警告。这是您的问题:内容拥抱优先级和内容压缩阻力。

Content Hugging Priority 是一个值,它指示视图的内容是否应该优先于将其超视图拉伸到超视图自身的约束。在这种情况下,您的标签没有优先于单元格内容视图来拉伸它,因此它会被压扁。

Content Compression Resistance 同样是一个值,它指示视图的内容是否具有优先权,以根据它自己的限制它的父视图的框架。例如,如果您的单元格想要达到高度 1,但您的标签具有更高的内容压缩阻力和高度(假设为 2),则单元格将被迫将自身限制为 2。

这里提供了一个很好的解释。

那我们来解决你的问题。

要么分配更大的内容拥抱优先级,要么分配内容压缩阻力。在您的情况下,标签似乎没有拉伸单元格的优先级,因此请设置拥抱优先级:

labelDatetime.setContentHuggingPriority(500, for: .vertical)

或者,尝试使用内容压缩以使单元格优先于控制其自身的高度,同时尊重标签的边界。

于 2017-07-10T07:24:59.130 回答
0

按照以下步骤UITableCell,根据内容使您的高度动态化。这是实现所有步骤的非常简单的方法。

  • 从您的UITableViewCell.
  • 删除所有编程约束。
  • 现在设置图中给出的所有约束UITableViewCell表视图约束
  • 表示给予所有约束left, right,topbottom
  • 如果您想要标签背景,请使用inspector of attributexCode 的右侧。
  • 如果您想使用收音机,请使用identity inspector选项卡并添加USER DEFINED RUNTIME ATTRIBUTES键路径 -> layer.cornerRadius,输入 ->Number和值 -> 5 / 或您想要提供的内容。
  • 如果你想给标签的行数,然后从Attribute Inspectoras 中选择作为multipleLine对齐方式。
  • 如果您不想要,请给出第 0 行的编号并选择multipleLine对齐并检查Automatically Adjust Font

现在让我们限制编程

//Set Both line in view did upload function with same format 
self.tableView.rowHeight = UITableViewAutomaticDimension
self.tableView.estimatedRowHeight = 100.0

如果您有使用,请删除功能

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
}
于 2017-07-10T07:39:02.623 回答