Размер слоя / границы во время основной анимации - PullRequest
2 голосов
/ 14 июля 2011

Я работаю над приложением 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 должно давать переходные значения.

Так что это просто не работает или я пропустил какой-то важный шаг?Спасибо за любую помощь.

...