Ok, quindi non è così veloce e bello come speravo ma funziona. Non è possibile utilizzare animatori e Core Animation nella manopola di scorrimento, poiché Core Animation funziona solo sui livelli e non è possibile accedere ai valori della manopola nel livello di scorrimento.
Quindi dobbiamo ricorrere invece all'animazione manuale del valore del cursore. Dato che lo stiamo facendo su un Mac, puoi usare NSAnimation (che non è disponibile su iOS).
Ciò che NSAnimation fa è semplice: fornisce un meccanismo di temporizzazione/interpolazione che consente all'utente di animare (al contrario dell'anima core che si collega anche alle viste e ne gestisce le modifiche).
Per utilizzare NSAnimation, lo si dovrebbe in genere sottoclasse e sostituisce setCurrentProgress:
e inserisce la logica.
Ecco come ho implementato questo - ho creato una nuova sottoclasse NSAnimation chiamato 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
Per utilizzarlo - è sufficiente crea un nuovo NSAnimationForSlider, dagli il cursore su cui stai lavorando come delegato e prima di ogni animazione impostalo come animateToValue e poi inizia l'animazione.
Ad esempio:
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];
Grazie per la risposta, forse si può dire più preciso come farlo?perché non ho capito esattamente cosa intendi. Cosa intendi per dire animazione di base? "animatore" penso sia l'animazione di base. –
Presto sarò sul mio desktop e cercherò di scriverlo in codice per te – shein
ok, grazie mille! Aspetterò. –