Swift NSTimer和IBOutlet问题

时间:2014-10-07 01:02:20

标签: swift nstimer iboutlet

我正在使用NSTimer更新图像在屏幕上的位置,以提供运动的幻觉。这是一个狡猾的鸟类克隆我正在创造学习斯威夫特。无论如何,我也通过显示增量Int作为分数来更新插座。但是,每次更新Int和相应的插座时,屏幕上的图像都会重置为起点(鸟和管)。很奇怪。还有其他人遇到过这个吗?我做错了什么?

@IBOutlet weak var tube1: UIImageView!
@IBOutlet weak var bird1: UIImageView!
@IBOutlet weak var score: UILabel!

func startTimer() {
    timer = NSTimer.scheduledTimerWithTimeInterval(0.02, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
}

func update() {
    bird1.center=CGPointMake(50,bird1.center.y+CGFloat(num));
    tube1.center=CGPointMake(tube1.center.x-CGFloat(num2),tube1.center.y);
    if(tube1.center.x<(-40)){
        tube1.center.x=screenWidth;//variable set outside this method
        tube1.center.y=0;//will be random
        updateMyScore();
    }
}

func updateMyScore(){
    myScore=++;

    score.text="Score: \(myScore)"
}

奇怪的是,如果我评论得分.text =“得分:( myScore)”行一切正常,但我想在屏幕上显示得分。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

AutoLayout正在运行并重置图像的位置。它正在运行,因为您正在更新UILabel。有两种方法可以解决这个问题:

  1. 禁用AutoLayout或
  2. 将管道和管道的位置存储在属性中,然后将其设置为viewDidLayoutSubviews()的覆盖。

  3. 以下是如何实施选项#2:

    @IBOutlet weak var tube1: UIImageView!
    @IBOutlet weak var bird1: UIImageView!
    @IBOutlet weak var score: UILabel!
    var tube1center: CGPoint?
    var bird1center: CGPoint?
    
    func startTimer() {
        timer = NSTimer.scheduledTimerWithTimeInterval(0.02, target: self, selector: Selector("update"), userInfo: nil, repeats: true)
    }
    
    func update() {
        bird1.center=CGPointMake(50,bird1.center.y+CGFloat(num));
        tube1.center=CGPointMake(tube1.center.x-CGFloat(num2),tube1.center.y);
        if(tube1.center.x<(-40)){
            tube1.center.x=screenWidth;//variable set outside this method
            tube1.center.y=0;//will be random
            updateMyScore();
        }
        bird1center = bird1.center
        tube1center = tube1.center
    }
    
    func updateMyScore(){
        myScore=++;
    
        score.text="Score: \(myScore)"
    }
    
    override func viewDidLayoutSubviews() {
        if let newcenter = tube1center {
            tube1.center = newcenter
        }
        if let newcenter = bird1center {
            bird1.center = newcenter
        }
    }
    

答案 1 :(得分:0)

是的,这是众所周知的自动布局行为。如果您执行任何导致自动布局引擎重新应用视图的约束(例如更新分数),则对布局相关属性的任何调整都将丢失,并根据约束重置为其值。

正如Vacawama指出的那样,你可以关闭自动布局。或者,不是手动更改计时器例程中的frame,而是可以为约束本身创建IBOutlet,然后您可以修改约束的constant属性,然后调用{ {1}}。这样,如果你碰巧做了一些触发约束的事情,一切都会好起来的。