You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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的表头。这样它天然就会随表格滚动,不会悬停:

修改步骤很简单:

  1. 先删掉原来那三个和section header相关的代理方法:numberOfSections、viewForHeaderInSection、heightForHeaderInSection
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:36:11