ios - 在车轮中以特定角度停止

时间:2017-07-14 08:36:59

标签: ios rotation

我正在研究iOS应用程序,有一个要求我必须制作一个轮子,使用这个轮子,应用程序将从服务器获得轮子图像,然后用户可以点击一个按钮来旋转它。
输入是车轮图像和特定角度,我必须在那个角度停止车轮!
除此之外,车轮在旋转时应具有速度 如果您有任何想法或解决方案,请与我分享。
非常感谢!

1 个答案:

答案 0 :(得分:0)

要创建此视图,最简单的方法是UIView剪切子视图(UIView上的属性)并且具有角半径(图层view.layer.cornerRadius上的属性)集到视图宽度(或高度)的一半。在此视图中添加带有图像的图像视图。

要旋转视图,您只需使用view.transform = CGAffineTransform(rotationAngle: angleInRadians)之类的转换即可。此属性是可动画的,因此您可以使用UIView.animate...方法为旋转设置动画。对于这种情况,您需要做的就是将动画块内的变换设置为目标角度,视图将正确旋转并进行动画处理。您也可以添加一些选项,例如曲线可以轻松进入,这将使车轮开始缓慢,然后加速,然后减速并停止。

如果你的情况是你的轮子在以某个角度停止之前可以制作几个圆圈,那么UIView动画可能有点不合适。在这种情况下,我会创建一个间隔为1.0/60.0的重复计时器,因此它将触发60FPS。当您的车轮启动时,您将保存一个开始日期:

startDate = Date()

和结束日期:

endDate = startDate.addingTimeInterval(expectedDuration) 

您还需要保存起始角度:

startAngle = currentAngle

和结束角度如:

endAngle = CGFloat(Int(currentAngle/(CGFloat.pi*2))*(CGFloat.pi*2)) + // This will roughly return how many circles have currently pass
           CGFloat.pi*(numberOfFullCircles*2) +  // Add full circles
           angleToStopAtInRadians // Add the destination angle

现在,只要定时器触发,您需要将视图的变换更新为目标旋转。您需要根据当前时间找到当前动画中的位置:

let absoluteScale = endDate.timeIntervalSince(Date())/endDate.timeIntervalSince(startDate)
let scale = CGFloat(max(0.0, min(absoluteScale, 1.0)))

然后我们需要使用线性插值:

currentAngle = startAngle + (endAngle-startAngle)*scale // Use this in the rotation matrix

要使用非线性(例如缓出),最好修改比例。为了方便起见,您可以使用scale = pow(scale, 1.0/1.3)。您可以根据需要使用这些值,或者找到/创建一些更有趣的算法。

然后你需要的最后一件事是在动画结束时停止计时器,这已经写在absoluteScaleif absoluteScale >= 1.0然后动画完成,你应该使计时器无效并触发任何需要在它之后执行。

玩得开心,当您遇到麻烦时,请发布一个包含一些细节和代码的新问题。