我试图用一个按钮停止在视图中上下动画的方块(上下循环)并读取位置(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条件,动画工作但没有什么能阻止它... 谁能帮我? 感谢
答案 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..");
}