我这里的布局有点奇怪,有点像这样(另见图片):
-UITableViewCell 1
----UIView 2
--------UITableView 3
UITableView(1)的 Controller 是这样的:
//mainTableView (1) controller
var cellHeights = [CGFloat]()
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
let card = CardSource.orangeCards[indexPath.row]
cell.configureCardInCell(card)
cellHeights.insert(card.frame.height + 15, at: indexPath.row)
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return cellHeights[indexPath.row]
}
但问题是,当屏幕第一次加载时,UIViews 重叠,因为单元格太小,因为较小的 TableView (UIView 中的那个)尚未加载并且它的高度未定义。证明是当我滚动到主 TableView 的底部然后向上滚动再次调用 cellForRowAt 并且两个 View 不再重叠(参见图片)。所以我基本上想要的是一种加载小 TableView 并在加载较大 TableView 之前定义它的高度的方法(或者如果您有任何其他解决方案,那也很受欢迎)
我知道我的问题不是很清楚,我不太擅长解释,所以不要犹豫,在评论中问我问题。
非常感谢!
After scrolling down then back up
编辑:
我发现了这个:
static var pharmacyOrangeCard: CardView {
let view = Bundle.main.loadNibNamed("Pharmacy Orange Card", owner: self, options: nil)?.first as! PharmacyTableCardView
print(view.frame.height)
return view
}
打印出正确的高度。但是,当我尝试从上面的 Controller 访问它时,它给了我一个较小的数字!与此同时,我应用了这些约束:
self.translatesAutoresizingMaskIntoConstraints = false
self.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width - 35).isActive = true
card.centerXAnchor.constraint(equalTo: cell.centerXAnchor).isActive = true
card.topAnchor.constraint(equalTo: cell.topAnchor).isActive = true
但我认为这不会影响高度,对吗?
编辑 2:
好的,所以我改变了这个约束:
self.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width - 35).isActive = true
为此:
card.leadingAnchor.constraint(equalTo: cell.leadingAnchor, constant: 17.5).isActive = true
card.trailingAnchor.constraint(equalTo: cell.trailingAnchor, constant: -17.5).isActive = true
所以这些约束似乎发挥了作用,因为现在我有了这个: enter image description here
顺便说一句,我不知道这是否重要,但我正在为这些“卡片”中的每一个使用 XIB 文件,并且高度不受限制,所以也许这会起作用?
解决编辑: 我通过这样做解决了这个问题:
override func viewDidAppear(_ animated: Bool) {
mainTableView.reloadData()
}
最佳答案
一旦单元格加载到屏幕上,您就无法更改该单元格的高度以获得更好的 UI 体验,
在层次结构中,heightForRowAt 在 cellForRowAt 之前被调用。
所以你有 2 个选项可以选择来解决你的问题
- 首先::在 TableView 尝试加载其中的单元格之前准备好高度值(在将委托(delegate)和数据源值设置到 TableView 之前准备好高度数组)
second::每当您需要更新 tableView 单元格以根据新的高度值重新建立时,每次在您更新高度值后调用它
yourTableView.reloadData()
关于ios - 如何手动加载 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51481703/