2012-09-17 114 views
4

我最近轉換的在我的OS X應用程序是層主辦的意見之一,一切都在山獅運作良好,但我測試的一個抱怨層麥凱納顯示在雪豹下。我已經寫了一個小測試應用程序來執行進一步的測試(源代碼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下工作?

回答

2

您是否試過將initWithFrame中的代碼移入awakeFromNib中?這似乎是一個常見的錯誤,導致圖層被搞砸。在this question問題是,這些圖層是在initWithFrame中設置的,但由於nib默認標記爲不需要圖層,所以它們在之後立即被擦除。將代碼移動到awakeFromNib,而不是使用傳遞的幀使用self.frame,看看是否解決了這個問題。至少,它不應該有任何惡化(我的Mac上運行的運行獅子移動代碼,awakeFromNib後,它仍然能正常工作,所以它沒有破壞任何東西),這可能只是你正在尋找解決方案對於。

希望這能奏效,或者您很快就會找到另一種解決方案。祝你有美好的一天。 :)

+0

這是它!最後,我實現了自定義指定初始化(創建程序的視圖),並從和'awakeFromNib'叫我共同'_setupView'方法。非常感謝! – trojanfoe

+0

不客氣。很高興我可以幫助你解決一定是一個非常令人沮喪的錯誤。 – Metabble

0

如果更改,會發生什麼:

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

到:

CALayer *layer = [CALayer layer]; 

不知道爲什麼它會有所作爲,但值得一試,也許。你也試過使用insertSubLayer:atIndex:而不是addSubLayer?

+0

嗯,這也看起來很可疑:self.layer = _rootLayer; 如果嘗試插入/添加_rootLayer,會發生什麼情況? –

+0

我試過'[CALayer new]'和'[[CALayer layer] retain]''。我不明白你的意思是「插入/添加你的_rootLayer」? – trojanfoe

+0

而不是做self.layer = _rootLayer ;, do [self.layer addSublayer:_rootLayer]; –