Jak animować efekt fadeIn fadeIn w NSTextField podczas zmiany jego tekstu?
Próbuję napisać kategorię dlaNSTextField
który doda nową metodęsetAnimatedStringValue
. Ta metoda ma ładnie zanikać bieżący tekst, a następnie ustawić nowy tekst, a następnie zanikać.
Poniżej moja implementacja: -
- (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];
}
Nie trzeba dodawać, ale powyższy kod w ogóle nie działa. Jedynym efektem, jaki widzę, jest migotanie paska postępu w tym samym oknie. Być może dlatego, że blokuję główny runloop, próbując go „animować”.
Proszę zasugerować, co jest nie tak z powyższym kodem.
Uwaga dodatkowa:
setAnimatedStringValue
jest zawsze wywoływany przez aNSTimer
, który jest dodawany do głównegoNSRunLoop
.