问题描述
我有一个自定义单元格类 (TripMatrixCell),其变量为 tripMatrixViewController。
class TripMatrixCell: UITableViewCell {
var tripMatrixViewController: TripMatrixViewController! {
didSet {
contentView.addSubview(tripMatrixViewController.view)
tripMatrixViewController.view.pinToSuperview()
}
}
}
tripMatrixViewController 是一个带有自定义 tableView 的 UIViewController,其中包含其他自定义单元格 (TwoColumnCondensedTripCell)。这是自定义 tableView 类,它将容纳 TwoColumnCondensedTripCells:
final class ContentSizedTableView: UITableView {
override var contentSize: CGSize {
didSet {
invalidateIntrinsicContentSize()
}
}
override var intrinsicContentSize: CGSize {
invalidateIntrinsicContentSize()
layoutIfNeeded()
return CGSize(width: UIView.noIntrinsicmetric,height: contentSize.height)
}
}
这个tableView设置在这里,在TripMatrixViewController中:
override public func viewDidLoad() {
super.viewDidLoad()
bind()
}
func bind() {
tableView = ContentSizedTableView(frame: view.frame,style: .plain)
tableView.delegate = self
tableView.dataSource = self
view.addSubview(tableView)
tableView.pinToSuperview()
tableView.register(TwoColumnCondensedTripCell.nib,forCellReuseIdentifier: TwoColumnCondensedTripCell.reuseIdentifier)
tableView.tableHeaderView = UIView(frame: CGRect.zero)
tableView.tableFooterView = UIView(frame: CGRect.zero)
tableView.backgroundColor = .clear
tableView.separatorStyle = .none
tableView.estimatedRowHeight = 167.0
tableView.rowHeight = UITableView.automaticDimension
tableView.clipsToBounds = false
tableView.isScrollEnabled = allowsScrolling
}
public func tableView(_ tableView: UITableView,heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
每当设置了 TripMatrixCells 的 tripMatrixViewController 变量时,它的视图(包含带有 TwoColumnCondensedTripCells 行的自定义 tableView)被添加为单元格 contentView 的子视图,然后被 pinnedToSuperview。这里是 pinToSuperview 方法:
func pinToSuperview() {
if let superview = superview {
self.pinToView(superview)
}
}
func pinToView(_ view: UIView) {
self.translatesAutoresizingMaskIntoConstraints = false
self.pinToView(view,insets: UIEdgeInsets.zero)
}
func pinToView(_ view: UIView,insets: UIEdgeInsets) {
self.translatesAutoresizingMaskIntoConstraints = false
superview?.addConstraint(NSLayoutConstraint(item: self,attribute: .top,relatedBy: .equal,toItem: view,multiplier: 1.0,constant: insets.top))
superview?.addConstraint(NSLayoutConstraint(item: self,attribute: .bottom,constant: -insets.bottom))
superview?.addConstraint(NSLayoutConstraint(item: self,attribute: .left,constant: insets.left))
superview?.addConstraint(NSLayoutConstraint(item: self,attribute: .right,constant: -insets.right))
}
我尝试使用此 TripMatrixCell 填充 UITableView,但是,包含此 TripMatrixCell 的行的高度不准确,并且单元格的底部被截断。在下面的屏幕截图中,TripMatrixCell 背景为黑色,其子视图(TwoColumnCondensedTripCells)由白色矩形表示,其中底部两个因行高未正确计算而被截断。
以下是设置试图显示 TripMatrixCell 的 tableView 的方法:
override public func viewDidLoad() {
super.viewDidLoad()
bind()
refreshControl = refreshController?.refreshControl
refreshController?.refresh()
}
func bind() {
tableView = UITableView(frame: view.frame,style: .grouped)
tableView.pinToSuperview()
tableView.register(TripMatrixCell.nib,forCellReuseIdentifier: TripMatrixCell.reuseIdentifier)
tableView.tableFooterView = UIView()
tableView.backgroundColor = .clear
tableView.separatorStyle = .none
tableView.estimatedRowHeight = 167.0
tableView.rowHeight = UITableView.automaticDimension
}
override public func tableView(_ tableView: UITableView,heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
如果我在 viewDidAppear 中调用 tableView.beginUpdates() 和 tableView.endUpdates(),我可以让单元格的高度正确加载,但问题是用户可以看到更新发生。
如何在第一遍中正确计算单元格的高度?我已经浏览了十几篇不同的帖子和文章来寻找解决方案,但到目前为止我所实施的一切都没有奏效。我希望我把事情安排得很清楚,而不会添加太多不必要的代码。如果没有,我准备在需要时提供更多信息。我已经花了十几个小时试图解决这个问题并感谢您的帮助!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)