これは私にいくつかの痛みを引き起こしています...
アプリでレイヤー ホスティング ビューを使用したいのですが、この奇妙な問題が発生しています。
簡単な例を次に示します。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 回あります) が、アニメーション化されません。もちろん、楕円はレイヤーの残りの部分と一緒に回転すると思います。
このプロジェクトは、喜んで手を差し伸べてくれる人のために、ここで利用できるようにしました。
ルノー