gpt4 book ai didi

ios - 带有 subview 的 UIViews : calculating position when scaling

转载 作者:行者123 更新时间:2023-11-28 13:03:25 26 4
gpt4 key购买 nike

我有一个使用 Core Graphics 绘制的 View ,在本例中是一个分段的圆。用户可以触摸圆圈以沿其圆周创建一个点;这会在包含圆形图形的 UIView 上创建一个 subview 。

然后我实现了一个双指缩放手势,它会导致圆重新绘制到新的大小。我已经看到大多数捏合缩放的实现都使用 transform 属性,但我选择重绘,因为它都是矢量并且给出了干净的结果。

我的问题是重新定位点 View 。我根据父 View 的比例计算这些点的所需位置:随着它的变化,我更新点 View 的 x/y 坐标。然而,似乎存在一些精度问题:随着圆形尺寸的增加,点会漂移,因此它们不再在线上。这里有几个例子:

a black point on a green circle segment

这是 100% 比例的圆圈。注意那个黑点的完美定位。但是当你放大...

enter image description here

该点漂移到离线状态。

这是一些代码。我从捏合手势的比例得出新的圆圈大小(为了 UI 目的,我修改了一点以限制和减慢它,所以这是 deltaScale)然后像这样绘制它:

let currentSize = self.shape!.bounds.size

let newSize = CGSize(width: self.originalSize.width * deltaScale, height: self.originalSize.height * deltaScale)

self.shape?.frame.size = newSize
self.shape?.center = self.originalCentre!

self.shape?.shapeSize = newSize
self.shape?.setNeedsDisplay()

随着双指缩放手势的完成,我计算了这个因数:

let xScale = Double(newSize.width) / Double(currentSize.width)
let yScale = Double(newSize.height) / Double(currentSize.height)

self.points = self.points.map{(thisPoint) -> UIView in
thisPoint.center = CGPoint(x: Double(thisPoint.center.x) * xScale, y: Double(thisPoint.center.y) * yScale)

return thisPoint
}

(我使用的是 CGFloats,但后来改用 Doubles,希望它能给我所需的精度。唉。)

最佳答案

您正在累积舍入误差。这是重复执行的:

       thisPoint.center = CGPoint(x: Double(thisPoint.center.x) * xScale, y: Double(thisPoint.center.y) * yScale)

重复任何低于无限精度的“x=f(x)”形式的计算将导致漂移。

诀窍是等号两边不要有“thisPoint.center”。最好的方法是让 thisPoint.center 成为其他状态的纯函数。评论者建议存储所需的角度,这样会很好。然后你可以这样做:

thisPoint.center = f(thisPoint.someRadians),其中 'f' 从 polar to rectangular coordinates 转换而来, 考虑到圆的规模。

关于ios - 带有 subview 的 UIViews : calculating position when scaling,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33350363/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com