1

NSTimersObjective-Cには2つあります。そのうちの 1 つは、iPhone の画面上でオブジェクトをゆっくりと上に動かします。もう 1 つは、0.5 秒ごとにスコアに 1 ポイントを追加するスコア タイマーです。オブジェクトを画面の上に移動するタイマーも 0.5 秒間隔です。これらのタイマーは、ボタンが押されると呼び出されてアクティブになります。ボタンを押すと、オブジェクトはその 0.5 秒間ゆっくりと画面を上に移動します。0.5 秒後、スコアに 1 ポイントが追加されますが、これは正常に機能します。

ただし、問題は、オブジェクトが 0.5 秒後に画面下部の元の位置に戻ることです。その後、再び 0.5 秒間上に移動し始め、すぐに画面の一番下に戻ります。スコアタイマーは完璧に機能し、0.5 秒ごとに 1 ポイントが加算されます。

コード

-(IBAction)play:(id)sender{

    gametimer1 = [NSTimer scheduledTimerWithTimeInterval:0.05f target:self selector:@selector(gameLoop) userInfo:nil repeats:YES];

    scoretimer = [NSTimer scheduledTimerWithTimeInterval:0.05f target:self selector:@selector(scorechange) userInfo:nil repeats:YES];
}

-(void)scorechange{

    score = score + 1;
    scorelab.text = [NSString stringWithFormat:@"%i", score];

}

-(void)gameLoop{

    balstarted = YES;
    bal.center = CGPointMake(bal.center.x, bal.center.y - balspeed);

}

もう一度、画面を上に移動する代わりに、オブジェクト bal を数ピクセル (0.5 秒間) だけ上に移動してから、以前の位置にリセットします。

4

2 に答える 2

2

改訂

自動レイアウトが有効になっています。を変更するscorelab.textと、 はUILabel、固有のコンテンツ サイズが変更されたことを自動レイアウト システムに通知します。これにより、自動レイアウトはすべてのビューの位置とサイズをリセットします。の制約を変更していないためbal、autolayout はその位置をリセットします。

autolayout をオフにするか、直接bal設定する代わりに の制約を変更できますcenter

于 2012-12-26T19:40:41.713 に答える
1

セレクターは両方とも、タイマーをスケジュールする同じスレッドで実行されます。同じスレッドから両方のタイマーをスケジュールする限り、干渉はありません。スケジュールされたメソッドで共有オブジェクトを使用する場合、競合状態はありません。
異なるスレッドからタイマーをスケジュールし、それらが共有オブジェクトを使用する場合にのみ、競合状態が発生します。

于 2012-12-26T18:03:04.010 に答える