我有一个家庭作业,我们需要一个"计时器"计算此点移动的次数(它在计时器上运行但是为int)。我教授给我们的源代码工作正常,但当我向moveButton()调用添加updateTime()调用时,它会立即停止工作,只会运行计时器而不是两者。
func updateTimer (){
value = value + 1;
timerLabel.text = "Time: " + String(value);
if (value >= 20){
gameOver = true;
}
}
func moveButton(t:NSTimer){
if (!gameOver && !paused){
let aWidth = self.view.bounds.size.width;
let aHeight = self.view.bounds.size.height;
let btnX = random() % (Int)(aWidth-60);
let btnY = random() % (Int)(aHeight-60);
button.frame = CGRectMake(CGFloat(btnX), CGFloat(btnY), 30.0, 30.0);
updateTimer();
}
}
override func viewDidLoad() {
super.viewDidLoad()
srandom(arc4random());
timer = NSTimer.scheduledTimerWithTimeInterval(1.5, target: self, selector: Selector("moveButton:"), userInfo: nil, repeats: true)
}
正如您所看到的那样,视图加载时会启动计时器。计时器调用moveButton(t:NSTimer),它最终调用updateTimer()方法。如果删除updateTimer()方法调用它将正常工作。所以我尝试一次删除1行以查看导致问题的原因,问题是将timerLabel.text设置为时间。为什么会阻止点移动?为什么不能更新标签文本并移动按钮?
答案 0 :(得分:2)
如果在XCode中打开拆分视图,然后右键单击按钮上的约束(例如顶部约束),则可以按住右键并拖动到该按钮的控制器。当你松开时,你将能够为该按钮创建一个约束插座。
从这里您可以添加或减去该约束以使用以下方式移动按钮:
constraintTop.constant = x
constraintLeft.constant = y
答案 1 :(得分:1)
可能您正在使用自动布局(即您在IB中定义了定义按钮位置的约束)。问题是,当您更新标签的文本时,会自动重新应用自动布局约束,因此您尝试调整按钮frame
的行为正在受到阻碍。
有很多方法可以解决这个问题。
恕我直言,最好的方法是为按钮的top
和leading
约束创建出口。然后,您可以使用您创建的插座以编程方式调整这两个约束的constant
属性。
绕过自动布局的优雅方法较少,包括:
设置按钮以使其没有约束(例如,在IB中编辑约束并单击“在构建时删除”选项;
以编程方式删除与按钮关联的约束;或
关闭自动布局。
然后您可以调整按钮的frame
,而不必担心自动布局引擎在标签更新时将其移回原始位置。
但是,我倾向于为约束添加插座,然后你可以让自动布局引擎为你移动按钮。