gpt4 book ai didi

macos - NSS slider 动画

转载 作者:行者123 更新时间:2023-12-03 16:08:39 26 4
gpt4 key购买 nike

如何在更改 NSSlider 的浮点值时创建 NSSlider 动画。我正在尝试:

[[mySlider animator] setFloatValue:-5];

但这不起作用..只需更改没有动画的值。那么也许有人知道如何做到这一点?

提前致谢。

最佳答案

好吧 - 所以这并不像我希望的那么快和漂亮,但它有效。您实际上无法在 slider 旋钮上使用动画器和核心动画 - 因为核心动画仅适用于图层,并且无法访问 slider 图层中的旋钮值。

所以我们必须求助于手动设置 slider 值的动画。由于我们是在 Mac 上执行此操作 - 您可以使用 NSAnimation (这在 iOS 上不可用)。

NSAnimation 的作用很简单 - 它提供了一种计时/插值机制,允许您制作动画(与 Core Animation 不同,Core Animation 也连接到 View 并处理对 View 的更改)。

要使用 NSAnimation - 最常见的是对其进行子类化并覆盖 setCurrentProgress: 并把你的逻辑放在那里。

以下是我的实现方法 - 我创建了一个名为 NSAnimationForSlider 的新 NSAnimation 子类

NSAnimationForSlider.h:

@interface NSAnimationForSlider : NSAnimation  
{
NSSlider *delegateSlider;
float animateToValue;
double max;
double min;
float initValue;
}
@property (nonatomic, retain) NSSlider *delegateSlider;
@property (nonatomic, assign) float animateToValue;
@end

NSAnimationForSlider.m:

#import "NSAnimationForSlider.h"

@implementation NSAnimationForSlider
@synthesize delegateSlider;
@synthesize animateToValue;

-(void)dealloc
{
[delegateSlider release], delegateSlider = nil;
}

-(void)startAnimation
{
//Setup initial values for every animation
initValue = [delegateSlider floatValue];
if (animateToValue >= initValue) {
min = initValue;
max = animateToValue;
} else {
min = animateToValue;
max = initValue;
}

[super startAnimation];
}


- (void)setCurrentProgress:(NSAnimationProgress)progress
{
[super setCurrentProgress:progress];

double newValue;
if (animateToValue >= initValue) {
newValue = min + (max - min) * progress;
} else {
newValue = max - (max - min) * progress;
}

[delegateSlider setDoubleValue:newValue];
}

@end

要使用它 - 您只需创建一个新的 NSAnimationForSlider,将您正在处理的 slider 作为委托(delegate)给它,并在每个动画之前设置它的 animateToValue,然后启动动画。

例如:

slider = [[NSSlider alloc] initWithFrame:NSMakeRect(50, 150, 400, 25)];
[slider setMaxValue:200];
[slider setMinValue:50];
[slider setDoubleValue:50];

[[window contentView] addSubview:slider];

NSAnimationForSlider *sliderAnimation = [[NSAnimationForSlider alloc] initWithDuration:2.0 animationCurve:NSAnimationEaseIn];
[sliderAnimation setAnimationBlockingMode:NSAnimationNonblocking];
[sliderAnimation setDelegateSlider:slider];
[sliderAnimation setAnimateToValue:150];

[sliderAnimation startAnimation];

关于macos - NSS slider 动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9015767/

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