我在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
?
答案 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