2012-03-04 3 views
17

Я пытаюсь научиться использовать и реализовывать CALayer в приложении Mac Objective-C, но я не могу показаться, наверное, самым простым - добавьте новый слой и установите его цвет фона/размер кадра. Может ли кто-нибудь увидеть, что не так с моим кодом?Как добавить CALayer в NSView на Mac OS X

CALayer *layer = [CALayer layer]; 
[layer setFrame:CGRectMake(0, 0, 100, 100)]; 
[layer setBackgroundColor:CGColorCreateGenericRGB(1.0, 0.0, 0.0, 1.0)]; 
[self.layer addSublayer:layer]; 
[layer display]; 

Я положил это в - (void)drawRect:(NSRect)rect методе моего пользовательские NSView подкласса, но при запуске приложения, он просто показывает пустой вид, без цвета фона или доказательств слоя я создал.

ответ

48

Прежде всего, вы не хотите добавлять слой в метод вида drawRect:, это автоматически вызывается системой, и вы, вероятно, в конечном итоге получите гораздо больше слоев, чем вы на самом деле хотите. initWithFrame: или initWithCoder: (для видов, которые находятся в файле nib), являются лучшими местами для инициализации иерархии слоев.

Кроме того, NSView s не имеет корневого слоя по умолчанию (это сильно отличается от UIView на iOS). Есть в основном два вида NSView s, которые используют слой: layer-подставил Просмотров и слой- хостинг просмотров. Если вы хотите напрямую взаимодействовать со слоем (добавить подслои и т. Д.), Вам необходимо создать слой , содержащий.

Для этого создайте CALayer и вызовите метод setLayer: вида. Затем позвоните по телефону setWantsLayer:. Порядок важен, если вы сначала назовете setWantsLayer:, вы фактически создадите вид с поддержкой слоя.

+0

спасибо за этот полезный ответ, я подумал, может быть, не было базового слоя, прикрепленного к nsview –

1

Положите это из drawRect. Обычно я устанавливаю настройку уровня как в методе init, так и в viewDidLoad.

В противном случае в любое время, когда вид рисуется, добавляется и выделяется новый слой. Кроме того, я никогда раньше не использовал линию [layer display]. Документы фактически говорят вам не обращаться к этому методу напрямую.

+0

Спасибо за ответ, но это все равно ничего не изменило. Представление остается пустым. BTW Я пытаюсь создать приложение mac os x, поэтому я не могу вызвать viewDidLoad. – GravityScore

+0

Извините, я пропустил это. Должен быть некоторый метод инициализации, который возникает при загрузке окна. Я не знаком с программированием на Mac, но я знаю, что iOS-мудрый, что QuartzCore необходимо импортировать для использования CALayer (я не хочу предполагать, что вы это знаете). То, что вы также можете попробовать, - это манипулировать корневым слоем напрямую, чтобы увидеть, работает ли это ([self.layer setBackgroundColor: ...]). – atreat

4

Вам необходимо обратиться к методу «setWantsLayer».

Заканчивать следующую документацию для описания для setWantsLayer: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSView_Class/Reference/NSView.html

В двух словах, ваш взгляд должен быть вид слоя-хостинга. Поскольку это представление уровня размещения, вы должны взаимодействовать со слоем и НЕ взаимодействовать с самим представлением и не добавлять к нему подзапросы.

[self setLayer:[CALayer new]]; 
[self setWantsLayer:YES];  // the order of setLayer and setWantsLayer is crucial! 
[self.layer setBackgroundColor:[backgroundColor CGColor]]; 
Смежные вопросы