2010-07-18 74 views
2

我无法使用图层托管视图。如预期(视图充满黑色)提供该版本的initWithFrame:作品“想要的Core Animation层”在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; 
} 

我希望能够以编程方式配置的看法,所以我想删除依赖于Interface Builder。以下是旨在实现这一目标的第二个版本。这不起作用。的观点保持不变颜色与父视图:

- (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; 
} 

我从文档中复制的代码和搜索,我发现网页和所有的例子确实做到了这一点,但它不工作!

我在做什么错?

回答

1

问题不在于图层,而是在视图生命周期中图层被初始化。

如果在代码中创建视图并将其添加到已经绘制到屏幕的窗口,则可以使用initWithFrame:方法创建图层。然而,如果这个观点正在从一个国家图书馆变为现实,这将不会起作用。当从NIB初始化时,将在父窗口完全初始化之前调用initWithFrame:方法,这导致层不显示。当窗口存储在NIB中时,可以使用awakeFromNib而不是initWithFrame:来确保图层被正确初始化。

当然,在可以创建图层的代码中有两点很难看。在上述两种用例中,viewDidMoveToSuperview被称为有用的点。应将检查添加到viewDidMoveToSuperview以确保图层仅创建一次。

(心理注 - 如果事情没有意义,你觉得你需要问的堆栈溢出那就是你需要一些睡眠好兆头。)

0

你能尝试调用initWithFrame以下?

[layer setFrame:[self bounds]];