У меня есть приложение с пользовательским подклассом 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