Pergunta

Como posso criar NSSlider de animação quando alterar o valor de flutuação ele.Eu estava tentando:

[[mySlider animator] setFloatValue:-5];

mas não funcionou..basta alterar o valor sem animação.Então, talvez, alguém sabe como fazer isso?

Obrigado antecipadamente.

Foi útil?

Solução

Ok - então isso não é tão rápida e bonita como eu esperava, mas funciona.Você não pode realmente usar animadores e Núcleo de Animação sobre o controle deslizante botão - porque Núcleo de Animação só funciona em camadas e não há nenhum acesso ao botão de valores no controle deslizante de camada.

Então, temos que recorrer, em vez de manualmente animação controle deslizante de valor.Desde que nós estamos fazendo isso em um Mac que você pode usar NSAnimation (que não está disponível no iOS).

O que NSAnimation não é simples - é fornecer um tempo/interpolação mecanismo para permitir que VOCÊ para animar (em oposição ao Núcleo de Animação que também se conecta à vista e lida com as mudanças que a eles).

Para usar NSAnimation - lhe mais comumente seria subclasse-lo e substituir setCurrentProgress: e colocar a sua lógica de lá.

Aqui está como eu implementou - eu criei um novo NSAnimation subclasse chamada 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

Para usá-lo basta criar um novo NSAnimationForSlider, dê a ele o controle deslizante que você está trabalhando como um delegado e antes de cada animação definir é animateToValue e, em seguida, basta iniciar a animação.

Por exemplo:

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

Outras dicas

Seu método funciona, mas há algo muito mais simples.

Você pode use o animador de proxy, você só precisa dizer a ele como para animá-lo.Para fazer isso, você precisa implementar o defaultAnimationForKey: método de NSAnimatablePropertyContainer o protocolo.


Aqui está uma simples subclasse de NSSlider que faz isso:

#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

Agora você pode simplesmente usar o animador de proxy:

[self.slider.animator setDoubleValue:100.0];

Certifique-se de vincular o QuartzCore quadro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top