既にスケジュールされているアニメーションを停止することはできません。しかし、ボタンが既に押されたかどうかを示すフラグBOOL
を使ってインスタンス変数を設定することができます。
たとえば、ボタンのターゲットがbuttonTapped
のメソッドであるとします。
フラグをNO
に初期化します。
- (id)init {
if (self = [super init]) {
buttonAlreadyTapped = NO;
}
return self;
}
ボタンのターゲットでは、フラグをYES
に設定します。
- (void)buttonTapped {
self.buttonAlreadyTapped = YES;
}
そして唯一のフラグがNO
ある場合alpha
を変更します。
for (NSInteger i = 1; i <= [menuItems count]; i++) {
UIButton *menuItem = [menuItems objectAtIndex:i-1];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (3 * i) * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
if (!self.buttonAlreadyTapped) {
menuItem.alpha = 1.0f;
}
});
}
は
UIKit
にメッセージを送信し、
常には、メインスレッド上で行われるべきであることに注意してください。
for (NSInteger i = 1; i <= [menuItems count]; i++) {
UIButton *menuItem = [menuItems objectAtIndex:i-1];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (3 * i) * NSEC_PER_SEC), dispatch_get_current_queue(), ^{
if (!self.buttonAlreadyTapped) {
dispatch_async(dispatch_get_main_queue(), ^{
menuItem.alpha = 1.0f;
});
}
});
}
あなたの質問に無関係ですが、今はUIKitスレッドセーフですか? – Rog
どういう意味なのか分かりません:> –
iOS5で何か変わっていない限り(そして私はそうは思わない)、あなたはメインスレッドを通してあなたのUIを更新することになっています。ディスパッチキューがバックグラウンドスレッドでUIを更新しているため、アプリで不安定な問題が発生する可能性があります。ここには、公式のドキュメント(ページの一番下)からのものがあります。http://developer.apple.com/library/ios/#documentation/uikit/reference/UIKit_Framework/Introduction/Introduction.html#//apple_ref/doc/uid/TP40006955 -CH1-SW1 – Rog