3

NSOutlineView でいくつかのセルをアニメーション化しようとしています。左パネルのデバイスの横にある iTunes 同期アイコンとして回転するようにアイコンをアニメーション化する必要があります。

私はアニメーションの分野であまり経験がありません。インターネット全体を調べて、この簡単な解決策を見つけました。

- (void)startAnimation:(CALayer *)layer {    
    CABasicAnimation *spinAnimation = (CABasicAnimation *)[layer animationForKey:@"spinAnimation"];
    if (!spinAnimation) {
        spinAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"];
        spinAnimation.toValue = [NSNumber numberWithFloat:-(5*2*M_PI)];
        spinAnimation.duration = 10;
        spinAnimation.repeatCount = 10000;
        [spinAnimation setRemovedOnCompletion:YES];
        [spinAnimation setSpeed:2.0f];
        [layer addAnimation:spinAnimation forKey:@"spinAnimation"];    
    }
}

このソリューションで私が抱えている問題は、NSCell の異なるサブクラスのいずれにも、使用できる CALayer がないことです。そこでまず、CALayer を含む NSImageView を追加して NSCell をサブクラス化することにしました。アニメーションは機能しましたが、エクスペリエンスはひどいものでした。画像ビューは信じられないほど非効率的で、ほとんどスクロールできず、アニメーションは行の 1 つでしか機能しませんでした。

私が今やろうとしているのは、サブクラス NSButtonCell (セルにアクションを設定する必要があります。そうしないと NSImageCell になります)、drawWithFrame メソッドをオーバーライドし、受信した NSView (controlView) に subLayer を追加して、それをアニメーション化します。

現在の問題は、アニメーションが機能しないことです。

コードを残します。

PLZヘルプ!

- (void)setObjectValue:(id<NSCopying>)obj {
    @try {        
        [super setImage:[NSImage imageNamed:@"syncImage.png"]];
        [super setObjectValue:nil];        
    }
    @catch (NSException *exception) {
        NSLog(@"CustomImageViewCell-setObjectValue: %@", [exception description]);       
        [self setImage:nil];
        [super setObjectValue:nil];           
    }    
}

- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
    [super drawWithFrame:cellFrame inView:controlView];
    if (![controlView layer]) {
        CALayer *layer = [CALayer layer];
        [layer setFrame:[controlView frame]];
        [controlView setLayer:layer];
    }

    CALayer *layer = [CALayer layer];
    [layer setFrame:cellFrame];
    [[controlView layer] addSublayer:layer];    

    [self startAnimation:layer];    
}

前もって感謝します。

みきわん。

4

1 に答える 1

0

編集:この回答はiOSでのみ機能します-元の質問はOSXで使用するためのものです


とプロパティを使用することをUIImageViewお勧めします。(これは基本的に、Apple が UIActivityIndi​​cator クラスに対して行っていることだと思います。) これは、回転した画像を常に再計算するよりも安価でパフォーマンスが高いはずです。animationImagesanimationDuration

したがって、イメージ エディタを使用して、アイコンの複数の「フレーム」を順番に回転させた位置に保存し、それらを使用してanimationImagesプロパティの配列を作成します。

于 2011-07-26T21:45:06.637 に答える