objective-c – 核心动画图层不在Snow Leopard下显示

我最近将我的OS X App中的一个视图转换为图层托管,并且所有这些视图在Mountain Lion下运行良好,但是我的一个测试人员抱怨这些图层没有在Snow Leopard下显示.我编写了一个小测试应用程序来执行进一步的测试(源代码
here),这个测试应用程序也不能在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;
}

以下是创建其他图层的方法:

- (CALayer *)_createOtherLayer
{
    CALayer *layer = [[CALayer alloc] init];
    layer.delegate = self;
    layer.anchorPoint = CGPointMake(0.5, 0.5);
    layer.bounds = CGRectMake(0.0, 0.0, 64.0, 64.0);
    layer.position = CGPointMake(0.0, 0.0);
    layer.needsDisplayOnBoundsChange = NO;
    layer.masksToBounds = YES;
    layer.shadowColor = CGColorGetConstantColor(kCGColorBlack);
    layer.shadowOffset = CGSizeMake(2.0, -2.0);
    layer.shadowRadius = 2.0;
    layer.shadowOpacity = 1.0;
    [_backgroundLayer addSublayer:layer];
    [layer setNeedsDisplay];
    return layer;
}

任何人都可以建议为什么这些层在10.6下不起作用?

最佳答案 您是否尝试将initWithFrame中的代码移动到awakeFromNib中?这似乎是一个常见的错误导致层被搞砸了.在
this question中,问题是这些图层是在initWithFrame中设置的,但由于nib默认标记为不需要图层,因此它们会立即被删除.将代码移动到awakeFromNib,而不是使用传递的帧使用self.frame并查看是否可以解决问题.至少它应该不会更糟(在将代码移动到awakeFromNib之后在我的Mac上运行Lion并且它仍能正常工作,所以它没有破坏任何东西),它可能只是你正在寻找的解决方案对于.

希望这有效,或者您很快就会找到另一种解决方案.祝你有美好的一天. 🙂

点赞