Хорошо - так что это не так быстро и красиво, как я надеялся, но это работает.
На самом деле вы не можете использовать аниматоры и Core Animation на регуляторе ползунка - потому что Core Animation работает только на слоях и нет доступа к значениям регулятора на слое слайдера.
Таким образом, мы должны вместо этого прибегнуть к ручному анимированию значения слайдера.
Поскольку мы делаем это на Mac - вы можете использовать NSAnimation (которая недоступна в iOS).
То, что делает NSAnimation, очень просто - оно обеспечивает механизм синхронизации / интерполяции, позволяющий ВАМ анимировать (в отличие от базовой анимации, которая также подключается к представлениям и обрабатывает их изменения).
Чтобы использовать NSAnimation - вы, как правило, делите его на подклассы и переопределяете setCurrentProgress:
и вставь туда свою логику.
Вот как я это реализовал - я создал новый подкласс NSAnimation под названием 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];