UIView
具有转换点、矩形等的函数。在坐标空间之间。我需要对UIBezierPaths
做同样的事情。作为说明,考虑两个视图viewA
和viewB
。我们在viewA
的坐标空间中有rectA : CGRect
。我们可以计算:
let rectB = viewB.convert(rectA, from:viewA)
现在假设我们从rect创建一个路径:
let pathA = UIBezierPath(rect: rectA)
问题是,如何计算rectB
。我们可以简单地:
let pathB = UIBezierPath(rect: rectB)
但只有当我们有rectB
时才有效。如果我们只有“路径A”呢?
我想要做到这一点,我们需要一个转换aTob
。然后我们可以做:
var pathB = pathA
pathB.apply(aTob)
所以问题归结为如何计算aTob
。为简单起见,假设不存在旋转。
因此,在viewA
中绘制pathA
应该在屏幕上绘制与在viewB
中绘制pathB
相同形状和位置的路径。
2条答案
按热度按时间nnsrf1az1#
一种解决方案是使用平移变换在贝塞尔曲线路径上调用
apply()
。您可以通过将
viewB
的原点转换为viewA
的坐标空间来计算变换所需的x和y。以下是一些可以放在Swift Playground中的示例代码:
输出量:
我相信这就是你要找的。
offset
的计算可能是向后的。如果pathB
的结果方向错误,请将offset
行更改为:以下是
UIView
的扩展,用于将UIBezierPath
从一个视图转换为另一个视图:这个答案假设两个视图都没有应用非恒等变换。根据OP自己的回答,显然其中一个或两个视图可能具有非恒等变换。
ehxuflar2#
使用像HangarRash发布的扩展,这里有一个解决方案,当两个视图具有相同的超级视图时可以工作。