あなたのコメントから、これはメインスレッドで実行されているように聞こえます。いくつか問題があります。色の変化が表示されない基本的な理由は、ループがメインスレッドをブロックしており、ビューは(通常)実行ループサイクルの最後にのみ再描画されるためです。これは、ループ全体が終了するまで発生しません。これを解決するにはさまざまな方法があります。最も簡単なのは、forループを実行するたびに手動で実行ループを実行することです。この作業をバックグラウンドスレッドに移動して、setBackgroundColor:
呼び出しをメインキューにディスパッチすることもできます。これを行う別の方法は、タイマー(NSTimerまたはタイマーディスパッチソースのいずれか)を使用して定期的に色を更新することです。
いずれにせよ、forループの途中でメインスレッドをスリープ状態にしないでください。メインスレッドをスリープ状態にする正当な理由はほとんどありません。スリープ状態にすると、UIがユーザー入力イベントを更新または処理できなくなります。
編集:これは私が言及したタイマーアプローチを示すいくつかのサンプルコードです:
@interface AppDelegate ()
@property (nonatomic, strong) NSTimer *colorChangeTimer;
@property (nonatomic) float red;
@property (nonatomic) float green;
@property (nonatomic) float blue;
@end
@implementation AppDelegate
- (id)init
{
self = [super init];
if (self) {
self.red = 0.5;
self.blue = 0.5;
self.green = 0.5;
}
return self;
}
- (void)updateColors:(NSTimer *)timer
{
NSColor *newColor = [NSColor colorWithDeviceRed:self.red green:self.green blue:self.blue alpha:1.0];
[self.window setBackgroundColor:newColor];
if (self.red >= 1.0) {
[self.colorChangeTimer invalidate];
self.colorChangeTimer = nil;
}
if (self.green > 1.0) {
self.green = 0.0;
self.red += 0.01;
}
if (self.blue >= 1.0) {
self.blue = 0.0;
self.green += 0.01;
} else {
self.blue += 0.01;
}
}
- (IBAction)changeColors:(id)sender
{
if (self.colorChangeTimer != nil) return;
self.colorChangeTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(updateColors:) userInfo:nil repeats:YES];
}
@synthesize window = _window;
@synthesize colorChangeTimer = _colorChangeTimer;
@synthesize red = _red;
@synthesize green = _green;
@synthesize blue = _blue;
@end