質問

float値を変更するときにNSSliderアニメーションを作成する方法私は試みていました:

[[mySlider animator] setFloatValue:-5];
.

しかしそれはうまくいきませんでした..アニメーションなしで値を変更するだけです。だから多分誰かがこれをどのようにするかを知っていますか?

事前にありがとうございました。

役に立ちましたか?

解決

OK - だから私が望んだのと同じくらい速くてきれいではありませんが機能します。 スライダノブでは実際にアニメーターとコアアニメーションを使用することはできません - コアアニメーションはレイヤーでのみ機能し、スライダレイヤーのノブ値へのアクセスはありません。

だから私たちは代わりにスライダー値を手動でアニメート化するためにリゾートする必要があります。 私たちはMacでこれをやっているので、 nsanimation (iOSでは利用できません)。

どのNSANIMATIONが単純であるか - (ビューに接続するコアアニメーションとは対照的に)アニメートするためのタイミング/補間メカニズムを提供し、それらへの変更を処理します)。

nsanimationを使用する - あなたは最も一般的にそれをサブクラス化し、setCurrentProgress:をオーバーライドするでしょう そしてそこにあなたの論理を置きます。

これは私が実装した方法です - 私はNSAnimationForSlider という新しいNSanimationサブクラスを作成しました

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を作成するだけで、デリゲートとして作業しているスライダを、アニメーショントゥローヘルを設定してからアニメーションを起動するだけです。

例えば:

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

他のヒント

あなたのメソッドは機能しますが、はるかに簡単なことがあります。

あなた Animatorプロキシを使用することは、それをアニメートする方法を知る必要があります。 これを行うには、defaultAnimationForKey:プロトコルからNSAnimatablePropertyContainerメソッドを実装する必要があります。


これを行うNSSliderの単純なサブクラスです。

#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
.


今すぐAnimator Proxyを使用することができます:

[self.slider.animator setDoubleValue:100.0];
.


QuartzCoreフレームワークを必ずリンクしてください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top