我正在尝试创建一个自我调整大小UITableView
,但不想使用自动布局来布局它的子视图。
有没有办法做到这一点? 我正在设置
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 40
但是在self.frame.size.height
中调整layoutSubviews
没有帮助,单元格保持在40高度,所以我假设我需要以不同的方法返回实际高度。对于UICollectionViewCells
,方法是
override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes
但我找不到UITableViewCell
的等价物。
感谢您的任何指示。
答案 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
}