0

これは私にいくつかの痛みを引き起こしています...

アプリでレイヤー ホスティング ビューを使用したいのですが、この奇妙な問題が発生しています。

簡単な例を次に示します。Xcode で新しいプロジェクトを作成し、AddDelegate に次のように入力するだけで簡単に実装できます (プロジェクトに QuartzCore を追加した後):

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    NSView *thisView = [[NSView alloc] initWithFrame:CGRectInset([self.window.contentView bounds], 50, 50)];

    [thisView setLayer:[CALayer layer]];
    [thisView setWantsLayer:YES];
    thisView.layer.delegate = self;

    thisView.layer.backgroundColor = CGColorCreateGenericRGB(1,1,0,1);
    thisView.layer.anchorPoint = NSMakePoint(0.5, 0.5);
    [self.window.contentView addSubview:thisView];

    //Create custom content
    [thisView.layer display];
}

次の CALayer Delegate メソッドも実装します。

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    [[NSColor blueColor] setFill];
    NSBezierPath *theBez = [NSBezierPath bezierPathWithOvalInRect:layer.bounds];
    [theBez fill];
}

このコードを実行すると、サブビューがウィンドウの contentView (大きな黄色の四角形) に追加されていることがわかります。これはレイヤーをホストするビューであると想定しています...そして楕円形が青で描かれているのがわかりますが、黄色の四角形の下にあり、原点はメイン ウィンドウの (0,0) にあります...実際には黄色のレイヤー内に描画されていないようです。

私のビューが実際にはレイヤーホスティングではないか、レイヤーに渡されるコンテキストが間違っていると思います...しかし、なぜ下にあるのでしょうか?

私は何か間違ったことをしているに違いない...

奇妙なことを続けるために、レイヤーに CABasicAnimation を追加すると、次のようになります。

CABasicAnimation *myAnimation = [CABasicAnimation animation];
myAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
myAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
myAnimation.fromValue = [NSNumber numberWithFloat:0.0];
myAnimation.toValue = [NSNumber numberWithFloat:((360*M_PI)/180)];

myAnimation.duration = 1.0;
myAnimation.repeatCount = HUGE_VALF;

[thisView.layer addAnimation:myAnimation forKey:@"testAnimation"];
thisView.layer.anchorPoint = NSMakePoint(0.5, 0.5);

黄色の背景はアニメーション化され、その中心を中心に回転しますが、青い楕円はレイヤーのフレームの内側に正しく描画されます (ウィンドウの原点の外側にもあるため、2 回あります) が、アニメーション化されません。もちろん、楕円はレイヤーの残りの部分と一緒に回転すると思います。

このプロジェクトは、喜んで手を差し伸べてくれる人のために、ここで利用できるようにしました。

ルノー

4

1 に答える 1

1

とった。この状況で呼び出されるコンテキストが NSGraphicsContext ではなく CGContextRef であるという事実に混乱しました。

CGContextRef から NSGraphicsContext を設定することで、必要な結果を得ることができるようです。

NSGraphicsContext *gc = [NSGraphicsContext graphicsContextWithGraphicsPort:ctx flipped:NO];
[NSGraphicsContext saveGraphicsState];

[NSGraphicsContext setCurrentContext:gc];

//ここに描画コードを挿入

[NSGraphicsContext restoreGraphicsState];
于 2013-02-20T12:51:16.173 に答える