gpt4 book ai didi

objective-c - 更改文本时,如何在 NSTextField 中为 fadeIn fadeOut 效果设置动画?

转载 作者:太空狗 更新时间:2023-10-30 03:56:44 26 4
gpt4 key购买 nike

我正在尝试为 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 总是由 NSTimer 调用,它被添加到主 NSRunLoop

最佳答案

在发布上一个答案后,我正在四处寻找。我要留下那个答案,因为它与您发布的代码密切相关,并且使用 NSViewAnimation。然而,我确实想出了一个相当简洁的版本,尽管它使用 NSAnimationContext 更难阅读(由于 block 参数缩进)。这是:

#import <QuartzCore/QuartzCore.h>

@interface NSTextField (AnimatedSetString)

- (void) setAnimatedStringValue:(NSString *)aString;

@end

@implementation NSTextField (AnimatedSetString)

- (void) setAnimatedStringValue:(NSString *)aString
{
if ([[self stringValue] isEqual: aString])
{
return;
}

[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
[context setDuration: 1.0];
[context setTimingFunction: [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseOut]];
[self.animator setAlphaValue: 0.0];
}
completionHandler:^{
[self setStringValue: aString];
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) {
[context setDuration: 1.0];
[context setTimingFunction: [CAMediaTimingFunction functionWithName: kCAMediaTimingFunctionEaseIn]];
[self.animator setAlphaValue: 1.0];
} completionHandler: ^{}];
}];
}

@end

注意:要使用此 API 访问此处使用的 CAMediaTimingFunction 类以指定非默认计时函数,您需要包含 QuartzCore。项目中的框架

也在 GitHub 上.

关于objective-c - 更改文本时,如何在 NSTextField 中为 fadeIn fadeOut 效果设置动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14174911/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com