2

私は 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 を使用すると移行値が得られるはずです。

これは壊れているだけですか、それとも重要なステップが欠けていますか? 助けてくれてありがとう。

4

0 に答える 0