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! 由于某种原因,问题是自动布局。 禁用后,一切按预期工作。
希望它能帮助未来的人!