Swift – 何时或如何在视图上实现animation开始?

我是Swift的新手,我试图实现一个简单的游戏。 在这个游戏中,一旦视图被加载,我想要定期的animation发生。

问题是,我尝试使用例如button.frame.origin.x += 50来设置animation的button,但不是将其从原点移动到50px,而是出现在button.frame.origin.x – 50并转到其(初始)位置。 有趣的是,在某一点上,我向用户显示一个AlertDialog ,并显示后,animation开始发生,如我所料。

我的问题和这个话题是一样的,但是接受的答案并没有为我解决。

有什么想法吗?

编辑:挖到代码和testing了很多我发现了我显示AlertDialog的方法也发生无效我的计时器。 我有两个计时器:一个更新UI时间(一个TextField),另一个执行animation。 两者都正在安排一项任务。 从我在这里读到的 ,不可能有两个这样的计时器。

一个计时器对象一次只能在一个运行循环中注册,尽pipe它可以被添加到该运行循环中的多个运行循环模式中。

因此,显而易见的解决scheme是将两个select器(函数)合并为一个,所以这个计时器将适用于这两个任务。 但是,如果我尝试更新UI并执行animation,则animation不能按预期工作。 我只是迷失在这个问题上,不能使这两件事情的工作。

这些是我的重要代码:

 override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) ... resetOrCreateGame() } func resetOrCreateGame() { // Do stuff to initialize values timerToRotate = NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: "rotateBlocks", userInfo: nil, repeats: true) } func rotateBlocks() { // Calculate positions to rotate UIView.animateWithDuration(0.5, delay: 0, options: UIViewAnimationOptions.CurveEaseOut, animations: { // Try to update a timer in the UI //self.timeLeft.text = String(self.seconds) for i in 0 ... 8 { println("\(i) before \(self.buttons[i].frame.origin.x) \(self.buttons[i].frame.origin.y)") self.buttons[i].frame.origin.x = self.positions[self.indicesToRotate[i]].x self.buttons[i].frame.origin.y = self.positions[self.indicesToRotate[i]].y println("\(i) after \(self.buttons[i].frame.origin.x) \(self.buttons[i].frame.origin.y)") } }, completion: { _ in println("completed") }) 

如果我离开self.timeLeft.text = String(self.seconds)注释,animation工作正常。 无论我如何尝试更新timeLeft,如果我这样做,它螺丝我的animation。 我试图更新它在一个单独的线程,调度它的主线程,甚至更新animation闭包里面:它只是不工作。

尝试使用SKAction来animation。

设置SKAction ,然后在SpriteKit node进行animation处理(用node名称replace“ node ”),并将其命名为action

然后,调用简单的方法:

[node runAction:action];

例如,如果您想设置一个SKAction ,在3秒的时间范围内向右移动一个标题为50个像素的节点…

 SKAction *action = [SKAction moveByX:50.0 y:0.0 duration:3.0]; [button runAction:action]; 

哎呀,如果我不多次运行一个动作,我只需要这样做:

 [button runAction:[SKAction moveByX:50.0 y:0.0 duration:3.0]]; 

最后,你可以使用runAction:completion:方法来运行你的SKAction ,但是在完成之后调用一个Objective-C block ,就像这样的编码例子:

 SKAction *action = [SKAction moveByX:50.0 y:0.0 duration:3.0]; [button runAction:action completion:^{ // some code here that runs after an animation completes }]; 

而且,如果你想要在一个节点上运行一系列的动作(如果你想在一个节点上移动一个button50像素到右边的button超过3秒钟,然后淡出1秒以上),就不会使代码复杂化。行动整合为一个行动,如下所示:

 SKAction *firstAction = [SKAction moveByX:50.0 y:0.0 duration:3.0]; SKAction *secondAction = [SKAction fadeAlphaTo:0.0 duration:1.0]; SKAction *theSequence = [SKAction sequence:[NSArray arrayWithObjects:firstAction, secondAction, nil]; [button runAction:theSequence] 

您可以在completion块中运行另一个操作,但使用sequence的方法会清除代码。

最后,我find了解决scheme! 由于某种原因,问题是自动布局。 禁用后,一切按预期工作。

希望它能帮助未来的人!