如何将针旋转半圆?
How rotate a needle in semicircle?
我想在用户输入重量时旋转针。
低值和高值根据用户身高动态变化。
pointer.transform = CGAffineTransform(rotationAngle: CGFloat(weight / low * .pi / 3))
此代码在低端工作。
但是我不知道怎么指低~高,过高
你想要做的是将weight
转换为0
和1
之间的值以获得“进度”值。您可以使用 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.
pointer.transform = CGAffineTransform(rotationAngle: CGFloat(weight / low * .pi / 3))
此代码在低端工作。 但是我不知道怎么指低~高,过高
你想要做的是将weight
转换为0
和1
之间的值以获得“进度”值。您可以使用 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.