Вид Core Animation иногда не отображается

Я работаю над проектом Cocoa с использованием Core Animation, и у меня есть настраиваемое представление, которое отображается в двух окнах. Он всегда отображается в одном окне, но иногда не отображается в другом, когда я запускаю приложение. Насколько я могу судить, это совершенно случайно. Вот код, который я вызываю при инициализации представления. Он переходит к этому коду независимо от того, появляется представление или нет.

[self setWantsLayer:YES];

root = [self layer]; // root is a CALayer

root.layoutManager = [CAConstraintLayoutManager layoutManager];
root.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable;

[root setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];

[self setNeedsDisplay:YES];

Почему иногда вид появляется, а иногда нет?

РЕДАКТИРОВАТЬ: Будет ли разница, если я создам корневой CALayer сам по себе, вместо того, чтобы устанавливать его на «слой» представления, как я сейчас делаю?


person Austin    schedule 26.05.2009    source источник


Ответы (2)


Похоже, было довольно простое решение, но оно не было хорошо задокументировано. Вместо того, чтобы устанавливать root для слоя подкласса представления, я создаю root как новый CALayer, а затем устанавливаю уровень представления как root. Код из исходного вопроса теперь выглядит так:

// self is the sub-classed NSView
[self setWantsLayer:YES];

// Set root to a new CALayer
root = [CALayer layer];

root.layoutManager = [CAConstraintLayoutManager layoutManager];
root.autoresizingMask = kCALayerWidthSizable | kCALayerHeightSizable;

[root setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];

// Set the view's layer to root
[self setLayer:root];

Я думаю, что иногда, когда был вызван мой код инициализации, представление не инициализировало связанный с собой слой, поэтому root не был назначен должным образом. Это всего лишь догадка, но внесение вышеуказанных изменений разрешило мою проблему с не всегда отображаемым представлением.

person Austin    schedule 27.05.2009

Когда вы говорите, что он отображается в двух окнах, вы имеете в виду, что есть два экземпляра класса представления, которые находятся в двух окнах, или вы имеете в виду, что вы пытались поместить один и тот же фактический экземпляр представления в два окна? Данное представление может быть частью только одной иерархии представлений. Установка его в один удалит его из иерархии, в которой он находился.

person Rob Napier    schedule 26.05.2009
comment
Есть два экземпляра одного и того же настраиваемого (подкласса) представления, по одному в каждом окне. Они оба были созданы путем перетаскивания настраиваемого представления в окно в Интерфейсном Разработчике, а затем установки настраиваемого класса для каждого. - person Austin; 26.05.2009