2016-11-26 2 views
1

Я сделал новый проект OS X в Xcode 8, добавил одно (изображение). Я перетащил его в исходный файл ViewController по умолчанию, чтобы добавить @IBOutlet (с именем «изображение»). Тогда в viewDidLoad(), я добавил:Почему слой должен быть nil, после wantLayer = true?

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 быть nil, после установки wantsLayer? Должен ли я установить layer сам, даже если я попрошу wantsLayer?

+0

см https://www.objc.io/issues/14-mac/appkit-for-uikit-developers/, который дает некоторые предупреждения о том, как подать в суд на слой при поддержке объекты слоя с изображением – Volker

+1

Фолькер: хороший ресурс! Что я получаю от этого, так это то, что весь код, который делает то, что я написал, на самом деле не так, и что мне нужно использовать путь 'wantUpdateLayer', если я хочу установить свойства на CALayer. (Это решает одну из моих проблем, но не все). Если вы опубликуете это как «ответ», я приму это. – Naha

ответ

1

Для изображений с поддержкой уровня на OS X не рекомендуется напрямую взаимодействовать со объектом слоя. Уровень принадлежит AppKit. Это описано в несколько более слов и здесь: https://www.objc.io/issues/14-mac/appkit-for-uikit-developers/

Теперь, если вы подклассы ваш взгляд и вернуть YES/истинна на wantsUpdateLayer свойство вашего NSView, вы можете обновить слой в updateLayer. Обратите внимание, что это приведет к тому, что AppKit не вызовет drawRect.

1

Для будущих поисковиков здесь приведен код Swift 3, чтобы безопасно установить радиус угла для изображения (или NSView), не требуется никакого подкласса. Это опасно для доступа к слою напрямую, потому что NSView не всегда поддерживаются уровнями Core Animation. Вместо этого вы можете создать представление уровня размещения и написать на него.

Так, в viewDidLoad():

let layer = CALayer() 
image.layer = layer 
image.wantsLayer = true 
image.masksToBounds = true 
image.cornerRadius = 19 
Смежные вопросы