Как добавить CALayer в NSView в Mac OS X
Я пытаюсь научиться использовать и реализовывать CALayer
в приложении Mac Objective-C, но, похоже, я не могу сделать что-то самое основное - добавьте новый слой и задайте его цвет фона/фрейм размер. Может ли кто-нибудь увидеть, что не так с моим кодом?
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
, но когда я запускаю приложение, он просто показывает пустое представление, не имеющее фонового цвета или свидетельства слоя, который я создал.
Ответы
Ответ 1
Прежде всего, вы не хотите добавлять слой в метод drawRect:
представления, который автоматически вызывается системой, и вы, вероятно, в конечном итоге получите гораздо больше слоев, чем вы на самом деле хотите. initWithFrame:
или initWithCoder:
(для представлений, которые находятся в файле nib), являются лучшими местами для инициализации иерархии слоев.
Кроме того, NSView
по умолчанию не имеет корневого уровня (это сильно отличается от UIView
на iOS). В основном существуют два типа NSView
, которые используют слои: просмотры с поддержкой слоев и представления на уровне слоев. Если вы хотите напрямую взаимодействовать с этим слоем (добавить подслои и т.д.), Вам необходимо создать представление уровня размещения.
Для этого создайте CALayer
и вызовите метод view setLayer:
. Затем вызовите setWantsLayer:
. Порядок важен, если вы сначала назовете setWantsLayer:
, вы действительно создадите представление с поддержкой слоя.
Ответ 2
Вам нужно сделать вызов метода "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]];
Ответ 3
Поместите это из drawRect. Обычно я устанавливаю настройку уровня как в методе init, так и в viewDidLoad.
В противном случае в любое время, когда вид создается, добавляется и выделяется новый уровень. Кроме того, я никогда раньше не использовал линию [layer display]. Документы фактически говорят вам не обращаться к этому методу напрямую.