如何将针旋转半圆?

How rotate a needle in semicircle?

我想在用户输入重量时旋转针。 低值和高值根据用户身高动态变化。

pointer.transform = CGAffineTransform(rotationAngle: CGFloat(weight / low * .pi / 3))

此代码在低端工作。 但是我不知道怎么指低~高,过高

你想要做的是将weight转换为01之间的值以获得“进度”值。您可以使用 inverseLerp 函数来执行此操作,它看起来像这样:

let progress = (weight - low) / (high - low)

此公式将 return 在 weight == low 时为 0,在 weight == high 时为 1。

现在您必须将其转换为旋转。假设您的箭头图像默认向上,我们需要在 [-pi / 2, pi / 2] 的范围内旋转。 pi 是半圈,所以我们向左旋转四分之一,向右旋转四分之一。

lerp 函数将 [0, 1] 范围内的值(就像我们已有的值)转换为范围内的值,这正是我们所需要的。它看起来像这样:

let value = (1 - progress) * start + progress * end

使用实际值,它看起来像这样:

let angle = (1 - progress) * (-.pi / 2) + progress * (.pi / 2)

我们现在用它来转换我们的箭头视图:

pointer.transform = CGAffineTransform(rotationAngle: angle)

默认情况下,视图将按中心旋转,因为默认情况下这是它们 `anchorPoint 所在的位置。由于我们希望我们的视图围绕其框架的底部中间旋转,我们可以这样更改它:

pointer.layer.anchorPoint = CGPoint(0.5, 1)

这应该像我们想要的那样旋转我们的视图。

PS:我制作了一个名为 CGMath 的库,其中包含这样的函数。你可以 check it out here.