Macos 核心动画期间的层大小/边界

Macos 核心动画期间的层大小/边界,macos,core-animation,presentation-layer,Macos,Core Animation,Presentation Layer,我正在为Mac OS X 10.6+开发Mac应用程序,需要在动画出现时重新绘制CAOpenGLLayer的内容。我想我已经阅读了所有必要的部分,但这对我来说根本不起作用。我按如下方式设置动画: [CATransaction setAnimationDuration:SLIDE_DURATION]; CABasicAnimation *drawAnim = [CABasicAnimation animationWithKeyPath:@"drawIt"]; [drawAnim setFromVa

我正在为Mac OS X 10.6+开发Mac应用程序,需要在动画出现时重新绘制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应该给出过渡值


那么,这只是打破或我错过了一些关键的步骤?谢谢您的帮助。

我使用CALayer尝试了这个场景,效果很好。在动画过程中,表示层确实会产生帧的大小。我对曹彭亚一点也不了解,所以我在那里帮不了什么忙。是否在DrawingGLContext:pixelFormat:forLayerTime:displayTime:method中查询表示层?对于CALayer,这就是我使用drawInContext:方法工作的地方。在动画过程中,表示层确实会产生帧的大小。我对曹彭亚一点也不了解,所以我在那里帮不了什么忙。是否在DrawingGLContext:pixelFormat:forLayerTime:displayTime:method中查询表示层?对于CALayer,这就是我使用drawInContext:方法的工作方式。