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

Swift中TableView滚动时,根据内容高度动态推进高亮视图

解决方案

问题根源

你当前的实现有两个核心问题:

  • 用了scrollViewWillBeginDragging,这个方法仅在拖拽开始时触发一次,无法在滚动过程中实时更新视图宽度
  • 计算逻辑依赖globalIndex(未知其更新逻辑),且比例计算错误,导致宽度数值不准确

修正代码

替换原方法为scrollViewDidScroll,并重新计算滚动进度:

override func scrollViewDidScroll(_ scrollView: UIScrollView) {
    guard let tableView = tableView, array.count > 0 else { return }
    
    // 总内容高度
    let totalContentHeight = tableView.contentSize.height
    // 屏幕可见高度
    let visibleHeight = tableView.bounds.height
    // 可滚动的总高度(内容超出屏幕的部分)
    let scrollableHeight = totalContentHeight - visibleHeight
    
    // 处理内容未超出一屏的情况
    guard scrollableHeight > 0 else {
        viewWidthConstraint.constant = UIScreen.main.bounds.width
        return
    }
    
    // 计算当前滚动进度(0=顶部,1=底部)
    let scrollProgress = scrollView.contentOffset.y / scrollableHeight
    // 限制进度在0-1之间,避免边界溢出
    let clampedProgress = max(0, min(scrollProgress, 1))
    
    // 计算绿色视图的目标宽度:从0到屏幕宽度逐步变化
    viewWidthConstraint.constant = clampedProgress * UIScreen.main.bounds.width
    
    // 触发视图更新
    view.layoutIfNeeded()
}

关键说明

  • scrollViewDidScroll会在滚动的每一刻被调用,保证宽度实时跟随滚动状态变化
  • 用contentOffset.y(当前滚动偏移量)除以scrollableHeight(总可滚动高度)得到0-1的进度值,再乘以屏幕宽度,确保滚动到底部时宽度刚好铺满屏幕
  • 增加边界判断,避免内容不足一屏时出现除以0的错误,同时直接将宽度设为最大值

内容的提问来源于stack exchange,提问作者Clean Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:55:18