Анимация на 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) и затем анимируйте его.

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

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

ПОМОГИТЕ ПЛЗ!.

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

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

Микиван.


person mikywan    schedule 22.07.2011    source источник
comment
Я работаю над решением при поддержке Apple. Как только получу, выложу сюда.   -  person mikywan    schedule 08.08.2011
comment
Извините, то, что мне дали люди из Apple, тоже не сработало, и у меня нет времени продолжать это прямо сейчас.   -  person mikywan    schedule 11.02.2012


Ответы (1)


Редактировать: этот ответ подходит только для использования в iOS — исходный вопрос предназначен для использования в OSX


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

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

person MechEthan    schedule 26.07.2011
comment
Извините, но это решение не работает для меня, так как оно для iOS. Я работаю на МАК. Спасибо, в любом случае. - person mikywan; 27.07.2011
comment
ак, извините! сделал пометку в верхней части моего ответа на случай, если кто-то еще найдет ваш вопрос, но хочет решить этот вопрос на iOS. - person MechEthan; 27.07.2011