如何在更改其浮动值时创建NSSlider动画。我在努力:
[[mySlider animator] setFloatValue:-5];
但这不起作用..只需更改没有动画的值。所以也许有人知道怎么做?
提前致谢。
答案 0 :(得分:6)
好的 - 所以这不像我希望的那么快和漂亮,但它确实有效。 您无法在滑块旋钮上实际使用动画制作者和核心动画 - 因为Core Animation仅适用于图层,并且无法访问滑块图层中的旋钮值。
因此我们不得不采用手动设置滑块值的动画。 由于我们在Mac上执行此操作 - 您可以使用NSAnimation(iOS上不可用)。
NSAnimation所做的很简单 - 它提供了一个定时/插值机制,允许你进行动画处理(而不是核心动画,它也连接到视图并处理对它们的更改)。
使用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,将它作为委托给您的滑块,在每个动画之前设置它为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];
答案 1 :(得分:3)
你的方法有效,但有一些更简单。
你可以使用动画代理,你只需要告诉它如何设置它的动画。
为此,您需要实施defaultAnimationForKey:
协议中的NSAnimatablePropertyContainer
方法。
这是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
现在你可以简单地使用动画师代理:
[self.slider.animator setDoubleValue:100.0];
确保链接QuartzCore
框架。