我正在使用while循环测试基本动画。当用户触摸开始按钮时,每次单击按钮都会随机出现图像。然后我在while循环中放置了相同的代码,图像似乎没有移动。我认为它只是在迭代中移动得太快,因此似乎没有移动。那么,有没有一种方法,简单或其他方式,我可以延迟循环的速度,所以我可以看到一定程度的过渡?我认为循环的速度正是这样做的,因为文本会立即输出到标签,因此我知道循环至少有效。这就是我的......
@IBAction func btnStart(sender: AnyObject) {
isMoving = true
var i = 0
while (i != 200) //arbitrary number of iterations chosen for this example
{
var x = arc4random_uniform(400)
var y = arc4random_uniform(400)
myButton.center = CGPointMake(CGFloat(x), CGFloat(y));
++i
lblHitAmount.text = String(i) //200 appears instantaneously in label, loop is working
}
}
编辑:
var timer = NSTimer()
var counter = 0
timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: Selector("tolabel"), userInfo: nil, repeats: true)
var i = 0
while (i != 800)
{
var x = arc4random_uniform(400)
var y = arc4random_uniform(400)
btnBug.center = CGPointMake(CGFloat(x), CGFloat(y));
++counter
++i
//lblHitAmount.text = String(i)
}
func tolabel(){
lblHitAmount.text = String(counter++)
}
答案 0 :(得分:1)
因此,要理解为什么会出现这种行为,您需要了解运行循环的概念。每个应用程序都有一个基本上是无限循环的运行循环。循环的每次迭代,它都做了很多事情。其中两个主要内容是处理事件(如点击按钮)和更新GUI。 每个运行循环只更新一次GUI 。
您的事件处理代码(用于点击btnStart)在单个运行循环迭代中运行。无论你延迟循环多长时间(例如10分钟),GUI都将保持冻结状态,直到完成,然后只显示文本设置的最后一个值。这就是你在应用程序和程序中冻结的原因。它们在运行循环的单次迭代中运行,不允许执行返回更新GUI。
如果您想定期更新文本,请查看NSTimer。您可以设置一个每X秒重复一次的计时器,每次计时器被触发时,它将在运行循环的不同迭代中执行,允许使用中间值更新GUI:
@IBAction func btnStart(sender: AnyObject) {
NSTimer.scheduleTimerWithTimeInterval(0.5, target: self, selector: "updateText:", userInfo: nil, repeats: false)
}
func updateText(timer: NSTimer) {
// do something to update lblHitAmount.text
// if you want to execute this again run:
NSTimer.scheduleTimerWithTimeInterval(0.5, target: self, selector: "updateText:", userInfo: nil, repeats: false)
// if you are done with the "loop" don't call scheduleTimerWithTimeInterval again.
}