使用按钮停止动画正方形

时间:2014-12-03 19:14:16

标签: ios animation swift uiview

我试图用一个按钮停止在视图中上下动画的方块(上下循环)并读取位置(x,y) 这是运动的代码

override func viewDidLoad() {
    super.viewDidLoad()

    while buttonPress == false {
    movement()
    }
}

func movement() {
    coloredSquare.backgroundColor = UIColor.blueColor()
    coloredSquare.frame = CGRect(x:0, y:500, width:50, height:50)
    self.view.addSubview(coloredSquare)
    movementDown()
}

func movementDown() {
    // lets set the duration to 1.0 seconds
    // and in the animations block change the background color
    // to red and the x-position  of the frame
    UIView.animateWithDuration(1.0, animations: {
        self.coloredSquare.backgroundColor = UIColor.blueColor()
        self.coloredSquare.frame = CGRect(x: 0, y: 500, width: 50, height: 50)
        }, completion: { animationFinished in
            self.movementUp()
    })
}

func movementUp() {
    UIView.animateWithDuration(1.0, animations: {
        self.coloredSquare.backgroundColor = UIColor.redColor()
        self.coloredSquare.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
        }, completion: { animationFinished in
            self.movementDown()
    })
}

如果我尝试使用WHILE做一个方法,直到条件为假,Xcode构建但模拟器停在启动屏幕,如果我取消while条件,动画工作但没有什么能阻止它... 谁能帮我? 感谢

3 个答案:

答案 0 :(得分:5)

首先,摆脱while循环。在动画的完成块中,首先检查动画是否在您调用另一个动画之前完成 - 如果取消动画,它将不会成立,因此动画将停止。在您的按钮方法中,您需要访问coloredSquare的表示层以获取其当前位置,并取消所有动画以使动画立即停止。

class ViewController: UIViewController {

var coloredSquare: UIView = UIView()

override func viewDidLoad() {
    super.viewDidLoad()
    [self .movement()];
}


func movement() {

    coloredSquare.backgroundColor = UIColor.blueColor()

    coloredSquare.frame = CGRect(x:0, y:500, width:50, height:50)

    self.view.addSubview(coloredSquare)

    movementDown()
}

func movementDown() {

    UIView.animateWithDuration(3.0, animations: {
        self.coloredSquare.backgroundColor = UIColor.blueColor()
        self.coloredSquare.frame = CGRect(x: 0, y: 500, width: 50, height: 50)
        }, completion: { animationFinished in
            if animationFinished {
                self.movementUp()
            }
    })
}

func movementUp() {
    UIView.animateWithDuration(3.0, animations: {
        self.coloredSquare.backgroundColor = UIColor.redColor()
        self.coloredSquare.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
        }, completion: { animationFinished in
            if animationFinished {
                self.movementDown()
            }
    })
}



@IBAction func stopBlock(sender: AnyObject) {
    var layer = coloredSquare.layer.presentationLayer() as CALayer
    var frame = layer.frame
    println(frame)
    coloredSquare.layer.removeAllAnimations()
    coloredSquare.frame = frame // You need this to keep the block where it was when you cancelled the animation, otherwise it will jump to the position defined by the end of the current animation
}

}

答案 1 :(得分:1)

因为你的while循环不能被打破。

你被困在一个无法破坏的无限循环中。

buttonPress == true

是不可能的

您需要在while循环中检查buttonPress。

但是,我根本不建议这样做。

相反,这是你应该做的:

创建一个带正方形的动画。让动画完成时触发回调,并将方块设置为底部动画。这样你就不必使用while循环。

虽然循环在主线程上非常危险(正如您目前所见)。

答案 2 :(得分:1)

你需要的是一个定期调用的函数,这样系统就不会被锁定,等待你的while循环结束。

您可以设置定时器来运行animation,如下所示:

NSTimer *animationTimer;
NSTimeInterval animationInterval = 1.0 / 30.0;

- (void) startAnimation{
    animationTimer = [NSTimer scheduledTimerWithTimeInterval:animationInterval target:self selector:@selector(animate) userInfo:nil repeats:YES];
}

- (void) stopAnimation{
    [animationTimer invalidate];
    animationTimer = nil;
}

- (void) animate {
    NSLog(@"do your animation here..");
}