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。所以起初我决定子类 NSCell 添加一个包含 CALayer 的 NSImageView。动画效果很好,但是体验很糟糕,图像视图非常低效,我几乎无法滚动,并且动画只能在其中一行中运行。

我现在要做的是子类 NSButtonCell(我需要为单元格设置一个操作,否则它会是一个 NSImageCell),覆盖 drawWithFrame 方法并将 subLayer 添加到接收到的 NSView(controlView)和然后动画它。

现在的问题是动画不起作用。

我把代码留给你。

请帮助!

- (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 - Original Question is for use in OSX


我建议使用UIImageView'sanimationImagesanimationDuration属性。(我相信这本质上是 Apple 为他们的 UIActivityIndi​​cator 类所做的。)这应该比不断重新计算旋转图像更便宜/性能更好。

因此,使用图像编辑器并将图标的多个“框架”保存在顺序旋转的位置,并使用它们来填充属性的数组animationImages

于 2011-07-26T21:45:06.637 回答