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
相关产品推荐
相关产品推荐

