使用UICollectionReusableView自定义UITableView表头不滚动的问题
解决UITableView表头无法随滚动移动的问题
嘿,我来帮你搞定这个表头滚动的问题!首先得明确:你遇到的其实是UITableView的默认行为——section header默认是悬停在顶部的,所以滚动表格时它会固定住,不会跟着内容一起滚走。如果想要让它随表格滚动,有两种简单方案:
方案一:用系统自带的开关(iOS 11+适用)
iOS 11之后,UITableView专门加了个属性来控制这个行为,直接一行代码就能解决:
// 在viewDidLoad或者tableView初始化的地方加上这句 tableView.sectionHeaderPinToVisibleBounds = false
把这个属性设为false,section header就会关闭悬停效果,和普通单元格一样跟着表格滚动,完全符合你的需求,这是最省事的办法。
方案二:兼容老系统的替代方案(iOS 11以下也能用)
如果你的App需要支持iOS 11之前的版本,那可以换个思路:把这个自定义表头当成UITableView的全局表头(tableHeaderView),而不是section的表头。这样它天然就会随表格滚动,不会悬停:
修改步骤很简单:
- 先删掉原来那三个和section header相关的代理方法:
numberOfSections、viewForHeaderInSection、heightForHeaderInSection - 在
viewDidLoad里设置tableHeaderView:
override func viewDidLoad() { super.viewDidLoad() // 加载你的自定义表头 let headerView = Bundle.main.loadNibNamed("StoresListHeaderView", owner: self, options: nil)?.first as! StoresListHeaderView // 手动设置表头的尺寸(tableHeaderView不会自动计算高度,得自己指定) headerView.frame = CGRect(x: 0, y: 0, width: tableView.bounds.width, height: 170) // 把它设为tableView的全局表头 tableView.tableHeaderView = headerView }
这样设置后,表头就会跟着表格内容一起滚动,而且所有iOS版本都能兼容。
顺便提一句
你用UICollectionReusableView来做这个表头完全没问题,它本质就是个UIView子类,不管是当section header还是tableHeaderView都能正常工作。问题的核心是UITableView对section header的默认悬停设定,和你的自定义视图类型无关哦~
内容的提问来源于stack exchange,提问作者Victor Rius
相关产品推荐
相关产品推荐

