NSTextField
新しいメソッドを追加するカテゴリを作成しようとしていますsetAnimatedStringValue
。このメソッドは、現在のテキストを適切にフェードアウトし、新しいテキストを設定してからフェードインすることになっています。
以下は私の実装です:-
- (void) setAnimatedStringValue:(NSString *)aString {
if ([[self stringValue] isEqualToString:aString]) {
return;
}
NSMutableDictionary *dict = Nil;
NSViewAnimation *fadeOutAnim;
dict = [NSDictionary dictionaryWithObjectsAndKeys:self, NSViewAnimationTargetKey,
NSViewAnimationFadeOutEffect, NSViewAnimationEffectKey, nil];
fadeOutAnim = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:
dict, nil]];
[fadeOutAnim setDuration:2];
[fadeOutAnim setAnimationCurve:NSAnimationEaseOut];
[fadeOutAnim setAnimationBlockingMode:NSAnimationBlocking];
NSViewAnimation *fadeInAnim;
dict = [NSDictionary dictionaryWithObjectsAndKeys:self, NSViewAnimationTargetKey,
NSViewAnimationFadeInEffect, NSViewAnimationEffectKey, nil];
fadeInAnim = [[NSViewAnimation alloc] initWithViewAnimations:[NSArray arrayWithObjects:
dict, nil]];
[fadeInAnim setDuration:3];
[fadeInAnim setAnimationCurve:NSAnimationEaseIn];
[fadeInAnim setAnimationBlockingMode:NSAnimationBlocking];
[fadeOutAnim startAnimation];
[self setStringValue:aString];
[fadeInAnim startAnimation];
}
言うまでもありませんが、上記のコードはまったく機能しません。私が見る唯一の効果は、同じウィンドウの進行状況バーのちらつきです。これはおそらく、メインのランループを「アニメーション化」しようとしているときにブロックしているためです。
上記のコードの何が問題なのか教えてください。
追記:
setAnimatedStringValue
は常に a によって呼び出されNSTimer
、これは main に追加されNSRunLoop
ます。