CALayer не рисует свой контент, пока используется CABasicAnimation - PullRequest
5 голосов
/ 29 июля 2010

У меня есть приложение с пользовательским подклассом CALayer.В этом подклассе слоя я переписал метод - (void) drawInContext:(CGContextRef)ctx.Это работает нормально, и все мои пользовательские материалы прорисованы.

Теперь я хотел добавить пользовательское свойство, которое будет анимироваться при изменении его содержимого.И мне нужно перерисовать, пока анимация работает.Я добавил свойство, как указано в ответе на следующий вопрос: Анимация пользовательского свойства подкласса CALayer

И я также добавил экземпляр CABasicAnimation для этого свойства в свой слой:

CABasicAnimation* theAnimation=[CABasicAnimation animationWithKeyPath:@"moveContentToLeft"];
theAnimation.duration=1.0;
theAnimation.fromValue=[NSNumber numberWithFloat:0.0];
theAnimation.toValue=[NSNumber numberWithFloat:10.0];
[area addAnimation:theAnimation forKey:@"moveContentToLeft"];

В моем методе рисования у меня есть оператор NSLog, в котором я выводю значение моего свойства, которое я анимирую.

Моя проблема заключается в том, что как только анимация запускает все содержимоеподкласс слоя очищается.NSLog выводит значения моего свойства, которое интерполируется (поэтому вызывается метод drawInContext).Но почему-то вещи, которые он рисует, не видны во время анимации.В конце анимации исходный контент снова становится видимым.

В данный момент анимированное свойство еще не используется при рисовании слоя, поэтому я ожидаю, что нормальный контент будет отрисован снова, и я получу выводNSLog с интерполированными значениями.

Мой слой является дочерним по отношению к другому слою (внутри UIView).Я попытался перерисовать суперслой в конце метода рисования (с вызовом _parent setNeedsDisplay [parent является ivar для родительского представления]).Это не помогло.И у меня также есть ощущение, что это не очень хорошая идея.

Я надеюсь, что кто-нибудь может мне помочь с этой проблемой.

Обновление

Благодаря примеруПроект от Мэтта Лонга Я мог видеть, что моя проблема заключается в методе рисования.Я расширил его проект, чтобы он показал ту же проблему.Я думаю, что это проще показать, чем оригинальный код;)

- (void)drawInContext:(CGContextRef)ctx
{
  NSLog(@"Getting called: Bob: %i", [self bob]);

  CGMutablePathRef path = CGPathCreateMutable();
  CGPathAddRect(path, NULL, CGRectMake(50 + [self bob], 50, 100, 100)); 
  CGContextAddPath(ctx, path);
  CGContextSetStrokeColorWithColor(ctx, [UIColor redColor].CGColor);
  CGContextSetLineWidth(ctx, 1.0);
  CGContextStrokePath(ctx);
  CGPathRelease(path);

  [_test testInContext:ctx]; // here is the problem
}

ivar _test - это пользовательский класс, который содержит некоторый код для рисования (в данный момент он рисует зеленую рамку).Теперь проблема в том, что этот зеленый прямоугольник не будет нарисован во время анимации.Как только анимация заканчивается, зеленое поле снова становится видимым.Расширенный пример проекта: http://dl.dropbox.com/u/5426092/ArbitraryPropertyAnimationNew.zip

1 Ответ

1 голос
/ 29 июля 2010

Трудно сказать, что происходит, не видя больше кода. У меня есть пример приложения, которое анимирует пользовательское свойство и положение слоя одновременно. Вы можете взглянуть на мой источник и посмотреть, что отличается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...