UIScrollView缩放场景下获取cycleView位置并居中展示view2的问题
前提视图层级

- scroll view
- container view
- cycle view
- container view
问题产生原因
- 坐标转换方法误用:
convert(_:to:)方法要求传入的第一个参数是调用方自身坐标系下的几何值,你传入的cycleView.frame是cycleView在其父视图(即containerView)坐标系下的值,不属于cycleView自身坐标系,第一步转换结果就存在错误。 - 坐标系不匹配:
view2添加在containerView上,它的center属性需要使用containerView的坐标系,你后续额外将坐标转换到了scrollView坐标系,两者坐标系不统一,自然无法得到正确位置,在scrollView存在缩放、滑动偏移的场景下偏差会进一步放大。
正确解决方案
如果cycleView是containerView的直接子视图,不需要做任何坐标转换,直接赋值即可:
view2.center = cycleView.center
如果cycleView和containerView之间还有其他嵌套的父视图,使用以下方式转换坐标:
// 将cycleView自身的中心点(自身bounds坐标系下)转换为containerView坐标系下的点 let targetCenter = cycleView.convert(CGPoint(x: cycleView.bounds.midX, y: cycleView.bounds.midY), to: containerView) view2.center = targetCenter
该方案下
view2和cycleView同属containerView的子视图,scrollView缩放时两个视图会同步跟随containerView缩放,相对位置保持一致,完全匹配需求。
内容的提问来源于stack exchange,提问作者Taras
相关产品推荐
相关产品推荐

