在wantLayer = true之后,为什么layer会为nil?

时间:2016-11-26 19:20:44

标签: macos calayer nsview

我在Xcode 8中创建了一个新的OS X项目,添加了一个(图像)视图。我将其拖动到默认的ViewController源,添加一个@IBOutlet(名为" image")。然后在viewDidLoad()中,我添加了:

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 = ...

所以它似乎应该如此。设置layer后,为什么wantsLayer为零?我是否应该自己设置layer,即使我要求wantsLayer

2 个答案:

答案 0 :(得分:1)

对于OS X上的图层支持视图,建议不要直接与图层对象进行交互。该图层由AppKit拥有。这里还会再说几句:https://www.objc.io/issues/14-mac/appkit-for-uikit-developers/

现在,如果您对视图进行子类化并在wantsUpdateLayer的{​​{1}}属性上返回YES / true,则可以在NSView中更新图层。请注意,这将导致AppKit不再调用updateLayer

答案 1 :(得分:1)

对于未来的搜索者来说,Swift 3代码可以安全地设置图像(或NSView)的角半径,不需要子类化。直接访问图层很危险,因为NSView并不总是由Core Animation图层支持。相反,您可以创建一个图层托管视图并写入该视图。

所以,在viewDidLoad()

let layer = CALayer()
image.layer = layer
image.wantsLayer = true
image.masksToBounds = true
image.cornerRadius = 19