2012-03-04 97 views
17

我試圖學習如何在Mac Objective-C應用程序中使用和實現CALayer,但似乎無法完成最基本的任務 - 添加一個新圖層並設置其背景顏色/框架大小。任何人都可以看到我的代碼有什麼問題嗎?如何將CALayer添加到Mac OS X上的NSView

CALayer *layer = [CALayer layer]; 
[layer setFrame:CGRectMake(0, 0, 100, 100)]; 
[layer setBackgroundColor:CGColorCreateGenericRGB(1.0, 0.0, 0.0, 1.0)]; 
[self.layer addSublayer:layer]; 
[layer display]; 

我把這個在我的自定義NSView子類的- (void)drawRect:(NSRect)rect方法,但是當我運行應用程序,它只是顯示一個空白視圖,我創建了層的無背景色或證據。

回答

48

首先,您不希望在視圖的drawRect:方法中添加圖層,系統會自動調用此圖層,並且最終可能會得到比您實際需要更多的圖層。 initWithFrame:initWithCoder:(對於位於nib文件中的視圖)是初始化圖層層次結構的更好位置。

此外,NSView默認沒有根層(這與iOS上的UIView完全不同)。基本上有兩種使用圖層的NSView s:圖層-支持查看和圖層-託管查看。如果您想直接與圖層交互(添加子圖層等),則需要創建一個圖層-託管視圖。

爲此,請創建一個CALayer並調用視圖的setLayer:方法。之後,致電setWantsLayer:。順序很重要,如果您先撥打setWantsLayer:,則實際上會創建一個支持圖層的視圖。

+0

謝謝你這個有用的答案,我想也許沒有附加到nsview的基本層 – 2013-12-08 16:13:14

1

把它放在drawRect中。我通常把我的圖層設置在init方法或viewDidLoad中。

否則,任何時候視圖繪製都會添加並分配一個新圖層。此外,我從未使用過[圖層顯示]行。文檔實際上告訴你不要直接調用這個方法。

+0

感謝您的回覆,但這仍然沒有改變任何東西。該視圖仍然是空白的。順便說一句我想創建一個mac os x應用程序,所以我不能調用viewDidLoad。 – GravityScore 2012-03-04 03:39:50

+0

哦,對不起,我錯過了。窗口加載時必須有一些初始化方法。我不熟悉Mac編程,但我知道iOS需要導入QuartzCore以使CALayer適用(我不想假設你知道這一點)。你也可以嘗試直接操作根層,看看它是否工作([self.layer setBackgroundColor:...])。 – atreat 2012-03-04 03:48:47

4

您需要調用「setWantsLayer」方法。

退房爲setWantsLayer說明下列文件: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html

簡而言之,您認爲需要將層託管視圖。由於它是圖層託管視圖,因此您應該與圖層進行交互,而不要與視圖本身交互,也不要爲其添加子視圖。

[self setLayer:[CALayer new]]; 
[self setWantsLayer:YES];  // the order of setLayer and setWantsLayer is crucial! 
[self.layer setBackgroundColor:[backgroundColor CGColor]];