代码之家  ›  专栏  ›  技术社区  ›  Naha

为什么在wantsLayer=true之后layer会为零?

  •  3
  • Naha  · 技术社区  · 8 年前

    我在Xcode 8中创建了一个新的OSX项目,添加了一个(图像)视图。我将其拖动到默认的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 = ...
    

    设置后为零 wantsLayer ? 我应该设定吗 我自己,即使我要求 wantsLayer ?

    2 回复  |  直到 8 年前
        1
  •  2
  •   teacup    7 年前

    对于未来的搜索者,这里有Swift 3代码来安全地设置图像(或NSView)的角半径,无需子类化。直接访问该层很危险,因为NSView并不总是由核心动画层支持。相反,您可以创建一个图层宿主视图并写入该视图。

    所以,在 viewDidLoad() :

    let layer = CALayer()
    image.layer = layer
    image.wantsLayer = true
    image.masksToBounds = true
    image.cornerRadius = 19
    
        2
  •  1
  •   Volker    8 年前

    对于OS X上的层支持视图,不建议直接与层对象交互。该层归AppKit所有。这在这里也用几句话来描述: https://www.objc.io/issues/14-mac/appkit-for-uikit-developers/

    现在,如果您将视图子类化并返回YES/true wantsUpdateLayer 你的财产 NSView ,可以在中更新图层 updateLayer .注意:这将导致AppKit不调用 drawRect