核心动画视图有时不显示

时间:2009-05-26 02:00:47

标签: cocoa macos core-animation

我正在使用Core Animation开发一个Cocoa项目,我有一个自定义视图,显示在两个窗口中。它总是出现在一个窗口中,但有时在我启动应用程序时不会出现在另一个窗口中。据我所知,这是完全随机的。这是我初始化视图时调用的代码。无论视图是否出现,它都会获得此代码。

[self setWantsLayer:YES];

root = [self layer]; // root is a CALayer

root.layoutManager = [CAConstraintLayoutManager layoutManager];
root.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable;

[root setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];

[self setNeedsDisplay:YES];

为什么视图有时会显示,有时则不显示?

编辑:如果我自己创建根CALayer而不是像我现在那样将它设置为视图的“图层”,它会有所作为吗?

2 个答案:

答案 0 :(得分:1)

看起来有一个非常简单的解决方案,但没有详细记录。我没有将root设置为子类视图的图层,而是将root创建为新的CALayer,然后将视图的图层设置为root。原始问题的代码现在看起来像:

// self is the sub-classed NSView
[self setWantsLayer:YES];

// Set root to a new CALayer
root = [CALayer layer];

root.layoutManager = [CAConstraintLayoutManager layoutManager];
root.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable;

[root setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];

// Set the view's layer to root
[self setLayer:root];

我在想,有时当我调用初始化代码时,视图没有初始化与自身关联的层,因此root没有得到正确的分配。这只是一种预感,但进行上述更改已解决了我的问题,视图并不总是显示。

答案 1 :(得分:0)

当你说它显示在两个窗口中时,你是说两个窗口中有两个视图类的实例,或者你的意思是你试图将相同的实际视图实例放到两个窗口中?给定视图只能是单个视图层次结构的一部分。将其安装到一个将其从它所在的层次结构中删除。