gpt4 book ai didi

cocoa - 图层托管 View 不显示

转载 作者:行者123 更新时间:2023-12-03 16:44:48 25 4
gpt4 key购买 nike

我在使用图层托管 View 时遇到问题。此版本的 initWithFrame: 按预期工作( View 填充为黑色),前提是在 Interface Builder 中选择了“想要核心动画层”:

- (id)initWithFrame:(NSRect)frame 
{
self = [super initWithFrame:frame];
if (self)
{
[self setWantsLayer:YES];
[[self layer] setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];
[[self layer] setContents:[NSImage imageNamed:NSImageNameBonjour]];
}
return self;
}

我希望能够以编程方式配置 View ,因此我想消除对 Interface Builder 的依赖。下面是旨在实现此目标的第二个版本。这是行不通的。该 View 与父 View 保持相同的颜色:

- (id)initWithFrame:(NSRect)frame 
{
self = [super initWithFrame:frame];
if (self)
{
CALayer *rootLayer = [CALayer layer]; //Added this line,
[self setLayer:rootLayer]; //and this line only
[self setWantsLayer:YES];
[[self layer] setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];
[[self layer] setContents:[NSImage imageNamed:NSImageNameBonjour]];
}
return self;
}

我从文档中复制了代码并搜索了网络,我发现的所有示例都完全做到了这一点,但它不起作用!

我做错了什么?

最佳答案

问题与图层无关,而是在 View 生命周期中图层被初始化时。

如果 View 是在代码中创建的,并将其添加到已绘制到屏幕上的窗口中,则可以使用 initWithFrame: 方法来创建图层。然而,如果 View 是从 NIB 初始化的,则这将不起作用。当从 NIB 初始化时,将在父窗口完全初始化之前调用 initWithFrame: 方法,这会导致图层不显示。当窗口存储在 NIB 中时,可以使用 awakeFromNib 代替 initWithFrame: 以确保各层正确初始化。

当然,在代码中有两个可以创建图层的点是很丑陋的。 viewDidMoveToSuperview 在上述两个用例中的有用点被调用。应向 viewDidMoveToSuperview 添加检查,以确保图层仅创建一次。

(请注意 - 如果某些事情没有意义,并且您觉得需要在 Stack Overflow 上提问,那么这是一个好兆头,表明您需要休息一下。)

关于cocoa - 图层托管 View 不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3277651/

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