我正在使用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)”行一切正常,但我想在屏幕上显示得分。有什么建议吗?
答案 0 :(得分:0)
AutoLayout正在运行并重置图像的位置。它正在运行,因为您正在更新UILabel
。有两种方法可以解决这个问题:
viewDidLayoutSubviews()
的覆盖。以下是如何实施选项#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}}。这样,如果你碰巧做了一些触发约束的事情,一切都会好起来的。