Я работаю над приложением Mac для Mac OS X 10.6+ и мне нужно перерисовать содержимое CAOpenGLLayer во время анимации.Я думаю, что я прочитал все необходимые части, но это просто не работает для меня.Я настроил анимацию следующим образом:
[CATransaction setAnimationDuration:SLIDE_DURATION];
CABasicAnimation *drawAnim = [CABasicAnimation animationWithKeyPath:@"drawIt"];
[drawAnim setFromValue:[NSNumber numberWithFloat:0]];
[drawAnim setToValue:[NSNumber numberWithFloat:1]];
[drawAnim setDuration:SLIDE_DURATION];
[chartView.chartViewLayer addAnimation:drawAnim forKey:@"drawIt"];
chartFrame.origin.x += controlFrame.size.width;
chartFrame.size.width -= controlFrame.size.width;
chartView.chartViewLayer.frame = CGRectMake(chartFrame.origin.x,
chartFrame.origin.y,
chartFrame.size.width,
chartFrame.size.height);
Свойство drawIt - это пользовательское свойство, единственное назначение которого - вызывать рисование слоя во время последовательных кадров анимации.Чтобы заставить это работать, вы должны добавить это к классу chartViewLayer:
+ (BOOL)needsDisplayForKey:(NSString *)key
{
if ([key isEqualToString:@"drawIt"])
{
return YES;
}
else
{
return [super needsDisplayForKey:key];
}
}
Так что, похоже, все работает нормально.Однако мне нужно получить текущий (анимированный) размер слоя перед его рисованием.Я нашел различную противоречивую информацию о том, как извлечь это из уровня представления.Вот что я попробовал, когда слой:
drawInCGLContext:(CGLContextObj)glContext
pixelFormat:(CGLPixelFormatObj)pixelFormat
forLayerTime:(CFTimeInterval)timeInterval
displayTime:(const CVTimeStamp *)timeStamp
метод вызывается во время анимации.Я попытался получить размер с помощью KVC и запросив либо рамку, либо границы.
CALayer *presentationLayer = [chartViewLayer presentationLayer];
//bounds.size.width = [[[chartViewLayer presentationLayer]
// valueForKeyPath:@"frame.size.width"] intValue];
//bounds.size.height = [[[chartViewLayer presentationLayer]
// valueForKeyPath:@"frame.size.height"] intValue];
//bounds.size = presentationLayer.bounds.size;
bounds.size = presentationLayer.frame.size;
NSLog(@"Size during animation: %f, %f", bounds.size.width, bounds.size.height);
Во всех случаях возвращаемое значение является конечным результатом анимации, а не переходными значениями.Насколько я понимаю, использование presentationLayer должно давать переходные значения.
Так что это просто не работает или я пропустил какой-то важный шаг?Спасибо за любую помощь.