我正在研究iOS应用程序,有一个要求我必须制作一个轮子,使用这个轮子,应用程序将从服务器获得轮子图像,然后用户可以点击一个按钮来旋转它。
输入是车轮图像和特定角度,我必须在那个角度停止车轮!
除此之外,车轮在旋转时应具有速度
如果您有任何想法或解决方案,请与我分享。
非常感谢!
答案 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)
。您可以根据需要使用这些值,或者找到/创建一些更有趣的算法。
然后你需要的最后一件事是在动画结束时停止计时器,这已经写在absoluteScale
:if absoluteScale >= 1.0
然后动画完成,你应该使计时器无效并触发任何需要在它之后执行。
玩得开心,当您遇到麻烦时,请发布一个包含一些细节和代码的新问题。