gpt4 book ai didi

cocoa - 绘制层 :inContext: draws background over content when using Layer-Hosting NSView

转载 作者:行者123 更新时间:2023-12-03 17:55:05 25 4
gpt4 key购买 nike

这让我有些痛苦......

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

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

如果我运行此代码,我可以看到 subview 被添加到 Windows contentView(大黄色矩形),并且我假设它是一个图层托管 View ...并且我可以看到正在绘制的椭圆形蓝色,但它位于黄色矩形下方,并且其原点位于主窗口中的 (0,0)...就好像它实际上并未绘制在黄色层内一样。 p>

我猜测要么我的 View 不是真正的层托管,要么传递到层的上下文是错误的......但为什么它会在下面?

我一定做错了什么......

为了继续奇怪的事情,如果我向图层添加 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);

黄色背景获得动画效果,绕其中心旋转,但蓝色椭圆在图层框架内正确绘制(但也在外部,在窗口的原点处,因此它在那里两次),但没有动画。当然,我希望椭圆与图层的其余部分一起旋转。

我做了这个项目available here对于那些愿意伸出援手的人。

雷诺

最佳答案

明白了。我很困惑,在这种情况下调用的上下文是 CGContextRef,而不是 NSGraphicsContext!

我似乎能够通过从 CGContextRef 设置 NSGraphicsContext 来获得我需要的结果:

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

[NSGraphicsContext setCurrentContext:gc];

//在此插入绘图代码

[NSGraphicsContext restoreGraphicsState];

关于cocoa - 绘制层 :inContext: draws background over content when using Layer-Hosting NSView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14971649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com