我正在使用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而不是像我现在那样将它设置为视图的“图层”,它会有所作为吗?
答案 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)
当你说它显示在两个窗口中时,你是说两个窗口中有两个视图类的实例,或者你的意思是你试图将相同的实际视图实例放到两个窗口中?给定视图只能是单个视图层次结构的一部分。将其安装到一个将其从它所在的层次结构中删除。