ios - 为 UITableView 启用分页时重新加载表后 UITableViewCell 的奇怪行为
问题描述
我有一个UITableView
和里面UITableViewCell
,我添加了视图并尝试根据屏幕高度或UITableView
's设置该视图的高度或单元格的高度height
。最初,我能够做到这一点,但是在viewWillAppear
重新加载表中时,无法为该视图或单元格的高度设置正确的高度。是身高问题还是其他问题,无法识别。任何帮助将不胜感激,并感谢您的回复。问题的标题可能令人困惑,或者您是否发现任何不相关的代码,然后欢迎提出建议(编辑)。
代码:
import UIKit
class PageViewController: UIViewController {
@IBOutlet weak var tblPager: UITableView!
let screenHeight = UIScreen.main.bounds.size.height
let vColors: [UIColor] = [.red, .blue, .orange, .brown, .cyan, .darkGray, .green, .red, .blue, .orange, .brown, .cyan, .darkGray, .green]
var pageSizeHeight: CGFloat = 0
override func viewDidLoad() {
super.viewDidLoad()
pageSizeHeight = screenHeight - (getTopSafeArea() + getBottomSafeArea() + 54)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
delay(interval: 10.0) {
print("Reload table after 10 seconds")
self.tblPager.reloadData()
}
}
}
//MARK:- TableView Delegate
extension PageViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return vColors.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "PageCell", for: indexPath) as! PageCell
cell.backgroundColor = vColors[indexPath.row]
cell.viewHeight.constant = pageSizeHeight
return cell
}
}
class PageCell: UITableViewCell {
@IBOutlet weak var vwPage: UIView!
@IBOutlet weak var viewHeight: NSLayoutConstraint!
}
func getTopSafeArea() -> CGFloat {
let window = UIApplication.shared.keyWindow
let topPadding = window?.safeAreaInsets.top ?? 0
return topPadding
}
func getBottomSafeArea() -> CGFloat {
let window = UIApplication.shared.keyWindow
let bottomPadding = window?.safeAreaInsets.bottom ?? 0
return bottomPadding
}
func delay(interval: TimeInterval, closure: @escaping () -> Void) {
DispatchQueue.main.asyncAfter(deadline: .now() + interval) {
closure()
}
}
输出:
解决方案
将其链接到 tableView 的高度,您的表格视图具有您需要的所有尺寸。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) {
// ...
cell.viewHeight.constant = tableView.frame.size.heigh
// ...
}
或删除viewHeight
约束并使用委托方法设置行高
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return tableView.frame.size.height
}
升级版:
TableViewestimatedRowHeight
用于计算其滚动偏移量。如果我们启用了分页但未配置,这确实会在重新加载期间产生问题estimatedRowHeight
。
解决方案 1:
实现estimatedHeightForRowAt
委托
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return tableView.frame.size.height
}
解决方案 2:
设置tableView.estimatedRowHeight = 0
和使用heightForRowAt
委托而不是viewHeight
约束
推荐阅读
- laravel - jpeg 文件在 laravel 中未被识别为图像
- javascript - 使用 Fastlane 在 TestFlight 上构建应用程序的构建命令失败
- python-3.x - 比较具有不同结构的两个数据
- python - Python - 如何构建具有“就地”选项的函数
- python - 为什么将 npy 文件(包含视频帧)转换为 tfrecords 会消耗太多磁盘空间?
- c# - AdomdDataReader GetValue(0) 返回 ???? 而不是非英文字符
- networking - 无法使用内置 ssh 客户端从 macOS SSH 到除 22 以外的任何端口上的远程主机
- android - 单击 FloatingActionButton 后,按钮保持相同颜色
- html - 未收到来自 mousePressed() 和 keyPressed() 的任何输入
- python - 如何从 Python 循环中填充 2 个列卡