Objective c 核心动画层不显示在“雪豹”下
我最近将我的OS X应用程序中的一个视图转换为层托管,并且在Mountain Lion下运行良好,但是我的一位测试人员抱怨说,在Snow Leopard下没有显示层。我已经编写了一个小的测试应用程序来执行进一步的测试(源代码),这个测试应用程序在10.6下也不能工作 下面是设置层的代码主体:Objective c 核心动画层不显示在“雪豹”下,objective-c,macos,osx-snow-leopard,calayer,Objective C,Macos,Osx Snow Leopard,Calayer,我最近将我的OS X应用程序中的一个视图转换为层托管,并且在Mountain Lion下运行良好,但是我的一位测试人员抱怨说,在Snow Leopard下没有显示层。我已经编写了一个小的测试应用程序来执行进一步的测试(源代码),这个测试应用程序在10.6下也不能工作 下面是设置层的代码主体: - (id)initWithFrame:(NSRect)frameRect { NSLog(@"initWithFrame"); self = [super initWithFrame:fr
- (id)initWithFrame:(NSRect)frameRect
{
NSLog(@"initWithFrame");
self = [super initWithFrame:frameRect];
if (self != nil)
{
srand((unsigned)time(NULL));
_rootLayer = [[CALayer alloc] init];
_rootLayer.delegate = self;
_rootLayer.anchorPoint = CGPointMake(0.0, 0.0);
_rootLayer.frame = NSRectToCGRect([self bounds]);
_rootLayer.needsDisplayOnBoundsChange = NO;
_rootLayer.masksToBounds = YES;
self.layer = _rootLayer;
self.wantsLayer = YES;
_backgroundLayer = [[CALayer alloc] init];
_backgroundLayer.delegate = self;
_backgroundLayer.anchorPoint = CGPointMake(0.5, 0.5);
_backgroundLayer.frame = CGRectInset(NSRectToCGRect([self bounds]), BACKGROUND_INSET, BACKGROUND_INSET);
_backgroundLayer.cornerRadius = 5.0;
_backgroundLayer.needsDisplayOnBoundsChange = NO;
_backgroundLayer.masksToBounds = YES;
[_rootLayer addSublayer:_backgroundLayer];
_mouseLayer = [self _createOtherLayer];
_mouseLayer.opacity = 0.5;
for (unsigned i = 0; i < NUM_OTHER_LAYERS; i++)
_otherLayers[i] = [self _createOtherLayer];
[_backgroundLayer addSublayer:_mouseLayer];
[_rootLayer setNeedsDisplay];
[_backgroundLayer setNeedsDisplay];
[self _positionOtherLayersInRect:frameRect];
_trackingArea = nil;
[self updateTrackingAreas];
}
return self;
}
有人能提出为什么这些层在10.6下不能工作吗?如果您更改:
CALayer *layer = [[CALayer alloc] init];
致:
不知道为什么会有不同,但也许值得一试。您还尝试过使用insertSubLayer:atIndex:而不是addSubLayer吗?您尝试过将initWithFrame:中的代码移动到awakeFromNib中吗?这似乎是一个很常见的错误,它会导致图层出错。问题在于,层是在initWithFrame中设置的,但是由于NIB在默认情况下被标记为不需要层,因此它们会立即被删除。将代码移动到awakeFromNib,使用self.frame来代替传递的帧,看看这是否解决了问题。至少它不应该更糟(在将代码移动到awakeFromNib之后,在我的Mac running Lion上运行,它仍然可以正常工作,所以它没有破坏任何东西),而且它可能就是您正在寻找的解决方案
希望这能奏效,否则你很快就会找到另一个解决方案。祝你今天愉快。:) 嗯,这看起来也很可疑:self.layer=\u rootLayer;如果您尝试插入/添加您的_rootLayer,会发生什么情况?我已经尝试了
[CALayer new]
和[[CALayer layer]retain]
。我不明白你所说的“插入/添加你的_rootLayer”?而不是执行self.layer=_rootLayer;,是什么意思;,do[self.layer addSublayer:_rootLayer];但是在那个阶段,self.layer
将是nil
?!?就这样!最后,我实现了一个自定义指定的初始值设定项(用于以编程方式创建视图),并从中调用了我的公共\u setupView
方法和awakeFromNib
。非常感谢!不客气。很高兴我能帮你解决一个相当令人沮丧的bug。
CALayer *layer = [[CALayer alloc] init];
CALayer *layer = [CALayer layer];