这让我有些痛苦...

我希望在我的应用程序中使用图层托管视图,但我遇到了这个奇怪的问题。

这是一个简单的例子。通过在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];
}


如果运行此代码,则可以看到该子视图已添加到Windows 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);


黄色背景被设置为动画,并围绕其中心旋转,但是蓝色椭圆被正确绘制在图层框架的内部(但在Window的原点也位于外部,因此它在其中两次),但是没有动画。我希望椭圆会随其余层一起旋转。

我已经为那些愿意伸出援手的人制作了这个项目available here

雷诺

最佳答案

得到它了。在这种情况下调用的上下文是CGContextRef,而不是NSGraphicsContext,这一事实使我感到困惑。

我似乎可以通过从CGContextRef设置NSGraphicsContext来获得所需的结果:

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

[NSGraphicsContext setCurrentContext:gc];


//在此处插入绘图代码

[NSGraphicsContext restoreGraphicsState];

关于cocoa - drawLayer:inContext:使用图层托管NSView时在内容上绘制背景,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14971649/

10-16 11:03