2016-11-26 1 views
1

Xcode 8에서 새로운 OS X 프로젝트를 만들었습니다. 단일 (이미지)보기가 추가되었습니다. @IBOutlet ("image")를 추가하기 위해 기본 ViewController 소스로 드래그했습니다. 그런 다음 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이 0이되지 않는 이유는 무엇입니까? wantsLayer을 요청하더라도 직접 layer을 설정해야합니까?

+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

향후 검색자를 위해 이미지 (또는 NSView)의 모서리 반경을 안전하게 설정하는 Swift 3 코드가 있으며 하위 클래스는 필요하지 않습니다. NSView가 Core Animation 레이어에 항상 뒷받침되지는 않기 때문에 레이어에 직접 액세스하는 것은 위험합니다. 대신 레이어 호스팅보기를 작성하고 그에 대한 글을 쓸 수 있습니다.

그래서

, viewDidLoad()에 :

let layer = CALayer() 
image.layer = layer 
image.wantsLayer = true 
image.masksToBounds = true 
image.cornerRadius = 19 
관련 문제