Как добавить CALayer в NSView на Mac OS X - PullRequest
19 голосов
/ 04 марта 2012

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

Ответы [ 3 ]

54 голосов
/ 04 марта 2012

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

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

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

5 голосов
/ 03 июля 2013

Вам необходимо вызвать метод 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]];
1 голос
/ 04 марта 2012

Уберите это из drawRect. Я обычно помещаю настройки слоя в метод init или viewDidLoad.

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

...