我正在使用Xcode 6 Beta 5与Swift制作iPhone游戏。它目前看起来像这样:
用户必须使用他们的手指在向上移动的块之间进行操纵。为此,我为每个块创建了UIViews,并使用算法生成随机路径。我首先使用animateWithDuration向上移动块,但当我尝试添加用户触摸块时的检测时出现了复杂情况。
我现在正尝试使用NSTimer进行动画:
var shiftBlockTimer = NSTimer.scheduledTimerWithTimeInterval(0.01, target: self, selector: Selector("shiftBlocks"), userInfo: nil, repeats: true)
func shiftBlocks() {
for leftBlock in leftBlocks {
leftBlock.frame.origin.y -= 70
}
for rightBlock in rightBlocks {
rightBlock.frame.origin.y -= 70
}
}
这确实有效,但是这个动作都是跳跃的,而不是我希望的平滑动作,并且在我使用animateWithDuration时也是如此。
有没有什么方法可以让这个动作变得更平滑,而不会增加迭代次数? (这会减慢我的应用程序)
答案 0 :(得分:3)
不要将NSTimer
用于动画。使用CADisplayLink
。 From the documentation:
CADisplayLink
对象是一个计时器对象,允许您的应用程序将其绘图与显示的刷新率同步。
但实际上,也不要使用CADisplayLink
。使用SpriteKit。它专为这样的2D游戏而设计。
答案 1 :(得分:0)
您应该使用Core Animation为图层设置动画(view.layer
)。
当我尝试添加用户触摸块的检测时,出现了并发症。
您可以通过检测与视图表示层(view.layer.presentationLayer
)的冲突来避免这些复杂情况。请参阅Accessing presentationLayer of an animation to detect collisions。
Apple' Core Animation Programming Guide的更多信息:
演示文稿树中的对象包含任何正在运行的动画的动态值。尽管图层树对象包含动画的目标值,但表示树中的对象会反映屏幕上显示的当前值。您永远不应该修改此树中的对象。相反,您可以使用这些对象来读取当前动画值,也许是为了从这些值开始创建新动画。