实际上,揭示问题的不是计数器,而是标签中值的设置。这是自动布局的问题,当您设置标签的值时,它会强制视图布局,并且自动布局功能会将按钮移回其原始位置。最简单的解决方法是关闭自动布局,这是从 IB 中的文件检查器(最左边的那个)完成的——只需取消选中“使用自动布局”框。
它发生得太快了,看不到发生了什么,但是如果您将代码更改为此(自动布局仍然打开),您将看到按钮移动,然后跳回:
-(IBAction)random:(id)sender{
int xValue = arc4random() % 320;
int yValue = arc4random() % 480;
button.center = CGPointMake(xValue, yValue);
counter = counter + 1;
[self performSelector:@selector(fillLabel) withObject:nil afterDelay:.5];
}
-(void)fillLabel {
score.text = [NSString stringWithFormat:@"Score: %i", counter];
}
如果要使用布局约束,另一种方法是更改布局约束的“常量”参数。在下面的示例中,我将按钮放在这样一个位置(在 IB 中),它对超级视图有一个左上角约束。我为这些约束制作了 IBOutlets 并将它们连接起来。这是代码:
@implementation ViewController {
IBOutlet UILabel *score;
int counter;
NSLayoutConstraint IBOutlet *leftCon;
NSLayoutConstraint IBOutlet *topCon;
}
-(IBAction)random:(id)sender{
int xValue = arc4random() % 300;
int yValue = arc4random() % 440;
leftCon.constant = xValue;
topCon.constant = yValue;
counter = counter + 1;
score.text = [NSString stringWithFormat:@"Score: %i", counter];
}