Objective c 核心动画层不显示在“雪豹”下

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

我最近将我的OS X应用程序中的一个视图转换为层托管,并且在Mountain Lion下运行良好,但是我的一位测试人员抱怨说,在Snow Leopard下没有显示层。我已经编写了一个小的测试应用程序来执行进一步的测试(源代码),这个测试应用程序在10.6下也不能工作

下面是设置层的代码主体:

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