2016-11-26 3 views
1

Xcode 8で新しいOS Xプロジェクトを作成し、単一の(画像)ビューを追加しました。デフォルトのViewControllerソースにドラッグして@IBOutlet(「image」という名前)を追加しました。その後viewDidLoad()で、私が追加:wantLayer = trueの後、レイヤーがnilになるのはなぜですか?

半分の時間について
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 

はすぐlayerを作成することになっwantsLayerを設定していますか?ドキュメントはこれを示唆しているようですが、これを明示的にする声明を見つけることはできません。私はNSViewのを作る多くのコード、like thisを、見てきました

は行います

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

ので、それはそれがあるべきように思えます。 wantsLayerを設定した後にlayerがゼロになるのはなぜですか?私がwantsLayerを求めても、自分でlayerを設定するはずですか?

+0

が担保層を訴える方法に関するいくつかの警告を与えるhttps://www.objc.io/issues/14-mac/appkit-for-uikit-developers/を参照してくださいビューのレイヤーオブジェクト – Volker

+1

Volker:素敵なリソース!私がこれから得ているのは、投稿したコードをすべて実際に間違っていることと、CALayerでプロパティを設定したい場合は 'wantsUpdateLayer'パスを使用する必要があるということです。 (それは私の問題のうちの1つを解決しますが、すべてではありません)あなたが「回答」としてそれを投稿すれば、私はそれを受け入れます。 – Naha

答えて

1

OS Xのレイヤーバックアップビューの場合、レイヤーオブジェクトと直接対話することはお勧めしません。このレイヤーはAppKitによって所有されています。それがここにもさらにいくつかの言葉で説明されていますhttps://www.objc.io/issues/14-mac/appkit-for-uikit-developers/

を今、あなたはあなたのビューのサブクラスを作成し、あなたのNSViewwantsUpdateLayer性質上/ YES trueを返す場合、あなたはupdateLayerに層を更新することができます。これにより、AppKitはdrawRectを呼び出さなくなります。

1

今後の調査には、イメージ(またはNSView)のコーナー半径を安全に設定するSwift 3コードがあります。サブクラス化は必要ありません。 NSViewsは常にCore Animationレイヤーに裏打ちされているわけではないので、レイヤーに直接アクセスすることは危険です。代わりに、レイヤー・ホスティング・ビューを作成してそれに書き込むことができます。 viewDidLoad()中のSO

、:

let layer = CALayer() 
image.layer = layer 
image.wantsLayer = true 
image.masksToBounds = true 
image.cornerRadius = 19 
関連する問題