Анимация на NSCell

Я пытаюсь анимировать некоторые ячейки в моем 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, добавив NSImageView, который содержит CALayer. Анимация работала, но опыт был ужасен, просмотр изображений был невероятно неэффективным, я едва мог прокрутить, и анимация работала только в одном из рядов.

То, что я пытаюсь сделать сейчас, это подкласс NSButtonCell (мне нужно будет установить действие для ячейки, в противном случае это был бы NSImageCell), переопределить метод drawWithFrame и добавить подслой в полученный NSView (controlView) и тогда оживите это.

Проблема сейчас в том, что анимация не будет работать.

Я оставляю вам код.

PLZ HELP!.

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

Заранее спасибо.

Mikywan.

1 ответ

Изменить: Этот ответ работает только для использования в iOS - Оригинальный вопрос для использования в OSX


Я бы предложил использовать UIImageView"s animationImages а также animationDuration свойства. (Я считаю, что это в основном то, что Apple делает для своего класса UIActivityIndicator.) Это должно быть дешевле / работать лучше, чем постоянный пересчет повернутого изображения.

Итак, используйте редактор изображений и сохраните несколько "кадров" вашего значка в последовательно повернутых позициях и используйте их для заполнения массива для animationImages имущество.

Другие вопросы по тегам