Анимация на 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
имущество.