【问题标题】:Using NSTimer to continuously shift UIViews upwards looks jumpy/not smooth使用 NSTimer 连续向上移动 UIViews 看起来很跳跃/不平滑
【发布时间】:2014-08-07 17:06:38
【问题描述】:

我正在使用 Xcode 6 Beta 5 和 Swift 制作 iPhone 游戏。目前看起来像这样:

用户必须用手指在向上移动的块之间移动。为此,我为每个块创建了 UIView,并使用算法生成随机路径。我首先使用 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 时也有。

有什么方法可以让这个运动变得更平滑,而不增加迭代次数? (这会降低我的应用速度)

【问题讨论】:

    标签: ios uiview swift nstimer


    【解决方案1】:

    不要将NSTimer 用于动画。使用CADisplayLinkFrom the documentation:

    CADisplayLink 对象是一个计时器对象,它允许您的应用程序将其绘图与显示器的刷新率同步。

    不过,实际上,也不要使用CADisplayLink。使用 SpriteKit。它专为此类 2D 游戏而设计。

    【讨论】:

    • 你打败了我。一定要试试这个。
    【解决方案2】:

    您应该使用 Core Animation 为图层设置动画 (view.layer)。

    当我尝试添加用户触摸块时的检测时出现了并发症。

    您可以通过检测与视图的表示层 (view.layer.presentationLayer) 的冲突来避免这些复杂情况。见Accessing presentationLayer of an animation to detect collisions


    更多信息来自 Apple 的Core Animation Programming Guide

    表示树中的对象包含任何正在运行的动画的运行中值。图层树对象包含动画的目标值,而表示树中的对象反映了当前值,因为它们出现在屏幕上。您永远不应修改此树中的对象。相反,您可以使用这些对象来读取当前动画值,也许是从这些值开始创建一个新动画。

    【讨论】:

    • 让我换一种说法。永远永远永远永远不要使用 NSTimer 做动画。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多