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

上一篇下一篇

猜你喜欢

热点阅读