問題を明らかにしているのは実際にはカウンターではなく、ラベルの値の設定です。これは自動レイアウトの問題であり、ラベルの値を設定すると、ビューのレイアウトが強制され、自動レイアウト機能によってボタンが元の位置に戻ります。最も簡単な修正は、自動レイアウトをオフにすることです。これは、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];
}
レイアウト制約を使用する場合のもう1つの方法は、レイアウト制約の「定数」パラメーターを変更することです。以下の例では、ボタンをスーパービューに対して左右の制約があるような場所(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];
}