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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:57:03