UITableView 表头覆盖单元格问题
2020-07-23 本文已影响0人
谢顶强
现象描述
UITableView在加载数据完毕后,刷新UI,此时表头覆盖了顶部的几个单元格,导致出现数据显示不完全的现象。由于公司测试设备型号不完全,仅在iPad mini(9.3.5)出现了此现象,其余的设备都可以显示完整的数据
代码分析
在使用UITableView 时,我直接在 UITableView 实例化的时候为其添加 tableHeaderView,并且此时实例化的 tableHeaderView 的frame 值为 zero。
之后,在控制器执行 ViewWilLayoutSubviews 时未 tableView 和 tableHeaderView 设置需要的frame
let tableView:UITableView = {
let tableView = UITableView(frame:.zero, style: .grouped)
tableView.backgroundColor = UIColor.bcBackgroundPrimary
tableView.register(BCUserIntegralTableViewCell.self,
forCellReuseIdentifier: BCUserIntegralTableViewCellID)
tableView.separatorStyle = .none
tableView.showsVerticalScrollIndicator = false
tableView.showsHorizontalScrollIndicator = false
tableView.tableHeaderView = UIView(frame:.zero)
}()
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(tableView)
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
tableView.frame =
CGRect(x:0,y:0,width:self.view.width,hight:self.view.height)
tableView.tableHeaderView?.frame =
CGRect(x:0,y:0,width:tableView.width,height:300)
}
解决方案
经过分析,我认为我们在为 UITableView 在控制器执行 ViewWillLayoutSubViews 之前已经执行了某些可能影响到 tableView 放置单元格区间的操作,而在控制器生成之后没有随着 tableHeaderView 的高度变化而及时变化,所以我决定在执行 ViewWillLayoutSubviews 之后再为 tableView 添加 tableHeaderView,如下
let tableView:UITableView = {
let tableView = UITableView(frame:.zero, style: .grouped)
tableView.backgroundColor = UIColor.bcBackgroundPrimary
tableView.register(BCUserIntegralTableViewCell.self,
forCellReuseIdentifier: BCUserIntegralTableViewCellID)
tableView.separatorStyle = .none
tableView.showsVerticalScrollIndicator = false
tableView.showsHorizontalScrollIndicator = false
}()
let tableHeader:UIView = UIView(frame:.zero)
override func viewDidLoad() {
super.viewDidLoad()
self.view.addSubview(tableView)
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
tableView.frame =
CGRect(x:0,y:0,width:self.view.width,hight:self.view.height)
tableHeader.frame =
CGRect(x:0,y:0,width:tableView.width,height:300)
tableView.tableHeaderView = tableHeader
}
安装到测试机,运行,OK