按钮不改变位置

时间:2015-11-02 23:03:21

标签: ios swift nstimer

我有一个家庭作业,我们需要一个"计时器"计算此点移动的次数(它在计时器上运行但是为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设置为时间。为什么会阻止点移动?为什么不能更新标签文本并移动按钮?

2 个答案:

答案 0 :(得分:2)

  1. 将插座添加到布局约束
  2. 如果在XCode中打开拆分视图,然后右键单击按钮上的约束(例如顶部约束),则可以按住右键并拖动到该按钮的控制器。当你松开时,你将能够为该按钮创建一个约束插座。

    从这里您可以添加或减去该约束以使用以下方式移动按钮:

    constraintTop.constant = x
    constraintLeft.constant = y
    

答案 1 :(得分:1)

可能您正在使用自动布局(即您在IB中定义了定义按钮位置的约束)。问题是,当您更新标签的文本时,会自动重新应用自动布局约束,因此您尝试调整按钮frame的行为正在受到阻碍。

有很多方法可以解决这个问题。

  1. 恕我直言,最好的方法是为按钮的topleading约束创建出口。然后,您可以使用您创建的插座以编程方式调整这两个约束的constant属性。

  2. 绕过自动布局的优雅方法较少,包括:

    • 设置按钮以使其没有约束(例如,在IB中编辑约束并单击“在构建时删除”选项;

    • 以编程方式删除与按钮关联的约束;或

    • 关闭自动布局。

    然后您可以调整按钮的frame,而不必担心自动布局引擎在标签更新时将其移回原始位置。

  3. 但是,我倾向于为约束添加插座,然后你可以让自动布局引擎为你移动按钮。