Swift中如何通过代码实现UITableView下拉隐藏表头、上拉重新显示
UITableView滚动动态隐藏/显示表头实现方案
第一步:新增属性
在你的SearchTableView类中新增以下3个存储属性:
// 记录上一次滚动的Y轴偏移量 private var lastScrollOffsetY: CGFloat = 0 // 表头固定高度,请替换为你实际的SearchHeaderView高度 private let headerFixedHeight: CGFloat = 80 // 表头当前是否处于隐藏状态 private var isHeaderHidden: Bool = false
第二步:实现表头高度动态控制代理方法
在SearchTableView的UITableViewDelegate实现中添加以下方法:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { // 如果你有多个section,只需要隐藏第0个section的表头,可以加判断 // guard section == 0 else { return 你其他section的表头高度 } return isHeaderHidden ? 0 : headerFixedHeight }
第三步:实现滚动监听逻辑
添加UIScrollViewDelegate的scrollViewDidScroll方法,监听滚动方向执行显示/隐藏逻辑:
func scrollViewDidScroll(_ scrollView: UIScrollView) { let currentOffsetY = scrollView.contentOffset.y // 过滤下拉到顶部的负数偏移场景,避免下拉触发不必要的状态切换 guard currentOffsetY > 0 else { lastScrollOffsetY = currentOffsetY return } // 滚动差值过小不处理,避免滚动抖动导致频繁切换状态 let offsetDelta = currentOffsetY - lastScrollOffsetY guard abs(offsetDelta) > 3 else { return } if offsetDelta > 0, !isHeaderHidden { // 向下滚动,执行隐藏逻辑 isHeaderHidden = true UIView.animate(withDuration: 0.25) { self.beginUpdates() self.endUpdates() } } else if offsetDelta < 0, isHeaderHidden { // 向上滚动,执行显示逻辑 isHeaderHidden = false UIView.animate(withDuration: 0.25) { self.beginUpdates() self.endUpdates() } } // 更新上次偏移量记录 lastScrollOffsetY = currentOffsetY }
可选优化
如果希望表头是跟随滚动渐变消失而非直接收起,可以改为修改表头的alpha和偏移,不需要调整高度:
- 在
viewForHeaderInSection方法中持有当前显示的header实例 - 在
scrollViewDidScroll中根据滚动偏移量动态修改header的alpha值和transform即可
内容的提问来源于stack exchange,提问作者swiftLearner
相关产品推荐
相关产品推荐

