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