【问题标题】:Core Animation Layers not displaying under Snow Leopard雪豹下不显示核心动画层
【发布时间】:2012-09-17 18:14:33
【问题描述】:

我最近将我的 OS X 应用程序中的一个视图转换为层托管,并且在 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 下不能工作?

【问题讨论】:

    标签: objective-c macos osx-snow-leopard calayer


    【解决方案1】:

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

    希望这可行,或者您很快就会找到另一个解决方案。祝你有美好的一天。 :)

    【讨论】:

    • 就是这样!最后,我实现了一个自定义的指定初始化程序(用于以编程方式创建视图)并从中调用我常用的_setupView 方法和awakeFromNib。非常感谢!
    • 不客气。很高兴我能帮助您解决一个非常令人沮丧的错误。
    【解决方案2】:

    如果你改变了会发生什么:

    CALayer *layer = [[CALayer alloc] init];
    

    到:

    CALayer *layer = [CALayer layer];
    

    不知道为什么会有所作为,但也许值得一试。您是否也尝试过使用 insertSubLayer:atIndex: 而不是 addSubLayer?

    【讨论】:

    • 嗯,这看起来也很可疑:self.layer = _rootLayer;如果您尝试插入/添加您的 _rootLayer 会发生什么?
    • 我试过[CALayer new][[CALayer layer] retain]。我不明白您所说的“插入/添加您的 _rootLayer”是什么意思?
    • 不做self.layer = _rootLayer;,做[self.layer addSublayer:_rootLayer];
    • 但是在那个阶段self.layer 将是nil?!?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    • 2023-04-07
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多