4

最近、OS Xアプリのビューの1つをレイヤーホストに変換し、すべてがMountain Lionで正常に機能していますが、テスターの1人がSnowLeopardでレイヤーが表示されないと不満を言っています。さらにテストを実行するための小さなテストアプリを作成しました(ソースコードはこちら)。このテストアプリも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未満で機能しない理由を誰かが提案できますか?

4

2 に答える 2

2

initWithFrame:のコードをawakeFromNibに移動してみましたか?レイヤーがめちゃくちゃになるのはよくある間違いのようです。この質問での問題は、レイヤーがinitWithFrameで設定されていたということでしたが、ペン先はデフォルトでレイヤーを必要としないものとしてマークされているため、すぐに消去されました。コードをawakeFromNibに移動し、渡されたフレームを使用する代わりに、self.frameを使用して、問題が解決するかどうかを確認します。少なくともそれは悪くないはずです(コードをawakeFromNibに移動した後にLionを実行しているMacで実行し、それでも正常に動作するため、何も壊れませんでした)、それはあなたが探している解決策かもしれませんにとって。

うまくいけば、これがうまくいくか、すぐに別の解決策が見つかります。良い一日を過ごしてください。:)

于 2012-09-20T21:31:02.180 に答える
0

変更するとどうなりますか:

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

に:

CALayer *layer = [CALayer layer];

なぜそれが違いを生むのかはわかりませんが、おそらく一撃の価値があります。また、addSubLayerの代わりにinsertSubLayer:atIndex:を使用しようとしましたか?

于 2012-09-20T18:59:13.520 に答える