Представление Layer-хостинга не отображается - PullRequest
2 голосов
/ 19 июля 2010

У меня проблемы с представлением слоя размещения.Эта версия initWithFrame: работает должным образом (представление заполнено черным цветом), при условии, что в Интерфейсном Разработчике выбран «Wants Core Animation Layer»:

- (id)initWithFrame:(NSRect)frame 
{
    self = [super initWithFrame:frame];
    if (self) 
    {
        [self setWantsLayer:YES];
        [[self layer] setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];    
        [[self layer] setContents:[NSImage imageNamed:NSImageNameBonjour]];
    }
    return self;
}

Я хочу иметь возможность настроить представление программно, поэтомухочу удалить зависимость от Interface Builder.Ниже приводится вторая версия, которая предназначена для достижения этой цели.Это не работаетПредставление остается того же цвета, что и родительское представление:

- (id)initWithFrame:(NSRect)frame 
{
    self = [super initWithFrame:frame];
    if (self) 
    {
        CALayer *rootLayer = [CALayer layer]; //Added this line,
        [self setLayer:rootLayer];  //and this line only
        [self setWantsLayer:YES];
        [[self layer] setBackgroundColor:CGColorGetConstantColor(kCGColorBlack)];    
        [[self layer] setContents:[NSImage imageNamed:NSImageNameBonjour]];
    }
    return self;
}

Я скопировал код из документации и выполнил поиск в Интернете, и все найденные примеры сделали именно это, но это не работает!

Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 19 июля 2010

Проблема не в слоях, а в жизненном цикле представлений слои инициализируются.

Если представление создается в коде и добавляется в окно, которое уже было нарисовано на экране, тогда для создания слоев можно использовать метод initWithFrame:. Однако это не будет работать, если представление инициализируется из NIB. При инициализации из NIB метод initWithFrame: будет вызван до полной инициализации родительского окна, в результате чего слои не будут отображаться. Когда окно сохраняется в NIB *, вместо initWithFrame: можно использовать awakeFromNib, чтобы обеспечить правильную инициализацию слоев.

Конечно, иметь в коде две точки, где можно создавать слои, - это ужасно. viewDidMoveToSuperview вызывается в полезной точке в обоих вышеупомянутых случаях использования. К viewDidMoveToSuperview следует добавить проверки, чтобы слои создавались только один раз.

(Заметка: если что-то не имеет смысла, и вам нужно спросить о переполнении стека, это хороший знак того, что вам нужно немного поспать.)

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

Можете ли вы попробовать вызвать следующее в initWithFrame?

[layer setFrame:[self bounds]];
...