2016-11-26 66 views
1

我在Xcode 8中創建了一個新的OS X項目,添加了一個(圖片)視圖。我將它拖到默認的ViewController源代碼中,添加@IBOutlet(名爲「image」)。然後在viewDidLoad(),我說:whyLayer = true後,爲什麼圖層是零?

image.wantsLayer = true 
image.layer!.cornerRadius = 10 

半個月左右的時間,它工作正常,和半個月左右的時間,將其與死:

fatal error: unexpectedly found nil while unwrapping an Optional value 

,而在第二線指向,並在調試器:

(lldb) po image.wantsLayer 
true 

(lldb) po image.layer 
nil 

是設置wantsLayer應該立即創建一個layer?文件似乎暗示了這一點,但我找不到一個明確的說法。

我已經看到了很多代碼,like this,這使得一個的NSView做:

self.wantsLayer = true 
self.layer!.backgroundColor = ... 

所以它看起來像它應該。爲什麼在設置wantsLayerlayer爲零?我是否應該自己設置layer,即使我要求wantsLayer

+0

看到https://www.objc.io/issues/14-mac/appkit-for-uikit-developers/這使得關於如何起訴層支持的一些警告查看圖層對象 – Volker

+1

Volker:漂亮的資源!我從中得到的結論是,所有發佈的代碼實際上都是錯誤的,如果我想在CALayer上設置屬性,我需要使用'wantsUpdateLayer'路徑。 (這解決了我的一個問題,但不是全部。)如果您將其作爲「答案」發佈,我會接受它。 – Naha

回答

1

對於OS X上的層支持視圖,不建議直接與圖層對象進行交互。該圖層由AppKit擁有。即在這裏也說幾句話描述:現在https://www.objc.io/issues/14-mac/appkit-for-uikit-developers/

,如果你繼承你的看法和你NSViewwantsUpdateLayer財產返還YES/true,則可以在updateLayer更新層。請注意,這將導致AppKit不再調用drawRect

1

對於未來的搜索者,這裏是Swift 3代碼來安全設置圖像(或NSView)的角半徑,不需要子類。直接訪問圖層是危險的,因爲NSView不總是由Core Animation圖層支持。相反,您可以創建一個圖層託管視圖並寫入該視圖。

所以,在viewDidLoad()

let layer = CALayer() 
image.layer = layer 
image.wantsLayer = true 
image.masksToBounds = true 
image.cornerRadius = 19 
相關問題