Macos NSSlider动画

Macos NSSlider动画,macos,cocoa,nsslider,Macos,Cocoa,Nsslider,如何在更改NSSlider动画的浮点值时创建它。我试着: [[mySlider animator] setFloatValue:-5]; 但那没用。。只需在没有动画的情况下更改值。也许有人知道怎么做 提前谢谢。好的-所以这并不像我希望的那么快和漂亮,但它确实有效。 实际上不能在滑块旋钮上使用动画师和核心动画,因为核心动画仅在层上工作,并且无法访问滑块层中的旋钮值 因此,我们不得不求助于手动设置滑块值的动画。 因为我们是在Mac上做这件事的——你可以使用(这在iOS上是不可用的) NSAnima

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

[[mySlider animator] setFloatValue:-5];
但那没用。。只需在没有动画的情况下更改值。也许有人知道怎么做


提前谢谢。

好的-所以这并不像我希望的那么快和漂亮,但它确实有效。 实际上不能在滑块旋钮上使用动画师和核心动画,因为核心动画仅在层上工作,并且无法访问滑块层中的旋钮值

因此,我们不得不求助于手动设置滑块值的动画。 因为我们是在Mac上做这件事的——你可以使用(这在iOS上是不可用的)

NSAnimation所做的很简单-它提供了一种计时/插值机制,允许您设置动画(与核心动画相反,核心动画还连接到视图并处理对视图的更改)

要使用NSAnimation,最常见的方法是将其子类化并覆盖
setCurrentProgress:
把你的逻辑放进去

下面是我如何实现的-我创建了一个名为
NSAnimationForSlider

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,将您作为代理处理的滑块赋予它,然后在每个动画之前设置它的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];

你的方法行得通,但还有更简单的方法

您可以使用animator代理,只需告诉它如何设置动画即可。 为此,需要从
NSAnimatablePropertyContainer
协议中实现
defaultAnimationForKey:
方法


下面是
NSSlider
的一个简单子类,它实现了以下功能:

#import "NSAnimatableSlider.h"
#import <QuartzCore/QuartzCore.h>

@implementation NSAnimatableSlider

+ (id)defaultAnimationForKey:(NSString *)key
{
    if ([key isEqualToString:@"doubleValue"]) {
        return [CABasicAnimation animation];
    } else {
        return [super defaultAnimationForKey:key];
    }
}

@end


确保链接到
QuartzCore
框架。

谢谢你的回答,也许你可以说更准确的方法?因为我不明白你到底是什么意思。你说的基本动画是什么意思?“动画师”我认为是基本的动画。我很快就会到我的桌面上,试着用代码为你写出来。好吧,我们正在谈论Mac。哇!没那么容易!非常感谢你的帮助!!!我会去测试和使用你的代码!哇,再次感谢你!!!我很高兴-如果你发现问题或改进-把它们发回来。祝你好运根据,还可以通过类扩展来启用此功能。但是子类化不太可能干扰其他代码。
[self.slider.animator setDoubleValue:100.0];