如何判断UIView子视图与UIScrollView中心是否重合?求替代方法
判断UIScrollView子视图是否处于可视中心的解决方案
嘿,这个坑我之前踩过!直接对比view.center肯定行不通,因为UIScrollView的contentOffset会让子视图的坐标系和scrollView的可视区域坐标系完全不在一个频道上。下面给你两个实用的实现方案:
方案一:坐标系转换后对比中心
核心思路是把子视图的中心转换到scrollView的可视区域坐标系(也就是scrollView的bounds坐标系),再和scrollView可视区域的中心做对比。注意一定要用阈值判断,避免浮点精度问题:
// 1. 将子视图的中心转换到scrollView的bounds坐标系下 let convertedSubviewCenter = scrollView.convert(subview.center, from: subview.superview) // 2. 获取scrollView可视区域的中心 let scrollViewVisibleCenter = CGPoint(x: scrollView.bounds.midX, y: scrollView.bounds.midY) // 3. 用极小阈值判断是否对齐(这里设1像素的误差范围,可根据需求调整) let isSubviewCentered = abs(convertedSubviewCenter.x - scrollViewVisibleCenter.x) < 1 && abs(convertedSubviewCenter.y - scrollViewVisibleCenter.y) < 1
方案二:反向转换可视中心到content坐标系
另一种思路是把scrollView的可视中心转换到子视图所在的content坐标系,再和子视图的中心对比,逻辑和方案一类似,只是转换方向不同:
// 1. 获取scrollView可视区域的中心 let scrollViewVisibleCenter = CGPoint(x: scrollView.bounds.midX, y: scrollView.bounds.midY) // 2. 将可视中心转换到子视图的父视图(即scrollView的contentView)坐标系 let centerInContent = scrollView.convert(scrollViewVisibleCenter, to: subview.superview) // 3. 阈值判断对齐状态 let isSubviewCentered = abs(subview.center.x - (centerInContent?.x ?? 0)) < 1 && abs(subview.center.y - (centerInContent?.y ?? 0)) < 1
为什么直接对比center没用?
简单说:subview.center是相对于它的父视图(scrollView的contentView)的坐标,而scrollView自己的center是相对于scrollView的父视图的坐标,两个坐标体系完全独立,直接对比自然不会相等。必须把它们统一到同一个坐标系下再做判断才靠谱。
内容的提问来源于stack exchange,提问作者Saiteja
相关产品推荐
相关产品推荐

