Как добавить CALayer в NSView в Mac OS X - программирование
Подтвердить что ты не робот

Как добавить 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, но когда я запускаю приложение, он просто показывает пустое представление, не имеющее фонового цвета или свидетельства слоя, который я создал.

4b9b3361

Ответ 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]. Документы фактически говорят вам не обращаться к этому методу напрямую.