Question

Comment puis-je créer une animation NSSlider lors de la modification de sa valeur flottante.J'essayais:

[[mySlider animator] setFloatValue:-5];

mais ça n'a pas marché..changez simplement la valeur sans animation.Alors peut-être que quelqu'un sait comment faire ça ?

Merci d'avance.

Était-ce utile?

La solution

Ok, donc ce n'est pas aussi rapide et joli que je l'espérais, mais ça marche.Vous ne pouvez pas réellement utiliser les animateurs et Core Animation sur le bouton du curseur - car Core Animation ne fonctionne que sur les calques et il n'y a pas d'accès aux valeurs du bouton dans le calque du curseur.

Nous devons donc recourir à l'animation manuelle de la valeur du curseur.Puisque nous faisons cela sur un Mac, vous pouvez utiliser NSAnimation (qui n'est pas disponible sur iOS).

Ce que fait NSAnimation est simple : il fournit un mécanisme de synchronisation/interpolation pour VOUS permettre d'animer (par opposition à Core Animation qui se connecte également aux vues et gère leurs modifications).

Pour utiliser NSAnimation - vous le sous-classerez le plus souvent et le remplacerez setCurrentProgress: et mettez votre logique là-dedans.

Voici comment j'ai implémenté cela : j'ai créé une nouvelle sous-classe NSAnimation appelée 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

Pour l'utiliser - vous créez simplement un nouveau NSAnimationForSlider, lui donnez le curseur sur lequel vous travaillez en tant que délégué et avant chaque animation que vous définissez, il est animateToValue, puis démarrez simplement l'animation.

Par exemple:

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];

Autres conseils

Votre méthode fonctionne, mais il existe quelque chose de beaucoup plus simple.

Toi peut utilisez le proxy de l'animateur, il vous suffit de lui indiquer comment l'animer.Pour ce faire, vous devez mettre en œuvre le defaultAnimationForKey: méthode de la NSAnimatablePropertyContainer protocole.


Voici une simple sous-classe de NSSlider ça fait ça :

#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

Vous pouvez désormais simplement utiliser le proxy de l'animateur :

[self.slider.animator setDoubleValue:100.0];

Assurez-vous de lier le QuartzCore cadre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top