使用NSTimer不断向上移动UIViews看起来有点跳跃/不顺畅

时间:2014-08-07 17:06:39

标签: ios uiview swift nstimer

我正在使用Xcode 6 Beta 5与Swift制作iPhone游戏。它目前看起来像这样:enter image description here

用户必须使用他们的手指在向上移动的块之间进行操纵。为此,我为每个块创建了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时也是如此。

有没有什么方法可以让这个动作变得更平滑,而不会增加迭代次数? (这会减慢我的应用程序)

2 个答案:

答案 0 :(得分:3)

不要将NSTimer用于动画。使用CADisplayLinkFrom 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的更多信息:

  

演示文稿树中的对象包含任何正在运行的动画的动态值。尽管图层树对象包含动画的目标值,但表示树中的对象会反映屏幕上显示的当前值。您永远不应该修改此树中的对象。相反,您可以使用这些对象来读取当前动画值,也许是为了从这些值开始创建新动画。