анимация пользовательского свойства CALayer - PullRequest
2 голосов
/ 03 июля 2010

Я пытаюсь определить свойство абстрактного слоя, угол на основе существующего положения свойства слоя.В основном это описывает ориентацию слоя от центра круга.Мне понравилось следующее:

@interface MenuItemLayer : CALayer
  @property CGFloat angle;
@end

@implementation MenuItemLayer

+ (BOOL)needsDisplayForKey: (NSString*)key {
  if ([key isEqualToString: @"angle"]) return YES;
  return [super needsDisplayForKey: key];
}

- (void)drawInContext: (CGContextRef)context {
  [self renderInContext: context];
}

- (CGFloat)angle {
  CGPoint center = self.superlayer.center;
  CGPoint pos = self.position;
  return atan2f(pos.x - center.x, center.y - pos.y);
}

- (void)setAngle: (CGFloat)angle {
  CGPoint center = self.superlayer.center;
  CGFloat radius = 100;
  [CATransaction begin];
  [CATransaction setDisableActions: YES];
  self.position = CGPointMake(center.x + radius * sinf(angle),
                              center.y - radius * cosf(angle));
  [CATransaction commit];
}

@end


Это прекрасно работает, когда я вручную устанавливаю значение с помощью setAngle :, но проблема в том, что, когда я пытаюсь анимировать его с помощью CABasicAnimation, представление поддерживаетсяMenuItemLayer вообще не перемещается и остается в своей исходной позиции, в то время как я вижу, что setValue: и drawInContext: обычно вызывается вместе с ходом анимации, и поэтому свойство position уровня представления обновляется.

У кого-нибудь есть подсказки?Спасибо!



----

Только что заметил следующий комментарий в документе:

<b>renderInContext:</b><br>
This method renders directly from the layer tree, ignoring any animations added to the render tree. Renders in the coordinate space of the layer.


Означает ли это, что renderInContext: всегда будет использовать слой модели для визуализации изображения даже в нашем случае, когда получатель метода drawInContext: является слоем представления?Может ли это быть причиной проблемы?Если да, то должен ли я всегда вручную переводить слой в нужное место, представленное слоем презентации?

1 Ответ

0 голосов
/ 04 июля 2010

Что вы намереваетесь сделать?

- (void)drawInContext: (CGContextRef)context {
  [self renderInContext: context];
}

Что происходит, когда вы это комментируете?Я считаю, что -renderInContext чаще всего используется для рендеринга в контекст ради сохранения его как изображения, так что это выглядит странно для меня.Базовая анимация должна быть в состоянии анимировать ваше свойство без проблем, но переопределение -drawInContext может иметь смысл только в том случае, если вы планируете сделать какой-либо пользовательский рисунок с помощью CG.

...