Layer Backed Views и мерцающие элементы управления - PullRequest
5 голосов
/ 31 октября 2008

У меня есть окно, которое содержит элемент управления NSBox. В этом NSBox есть несколько других элементов управления (всплывающие окна, текстовые поля и т. Д.)

У меня есть два других NSBox в одном и том же NIB-файле, которые заполнены элементами управления, которые я хотел бы поменять с первым при определенных условиях. Я бы хотел, чтобы это происходило с хорошим эффектом перекрестного затухания, поэтому я делаю следующее:

В методе NSWindowController -awakeFromNib:

[[self.myWindow contentView] setWantsLayer:YES];

В моем методе, где я переключаю представления, я использую этот код:

[[[self.myWindow contentView] animator] replaceSubview:previousView with:newView];

Это работает просто отлично, взгляды пересекаются, как я и ожидал. Проблема в том, что элементы управления в представлениях иногда исчезают без видимой причины. Это не всегда одни и те же представления (хотя кнопки NSPopUpButton кажутся особенно склонными к этому), и они обычно появляются снова, когда имеют фокус.

Нужно ли создавать резервные копии всех слоев управления?


Обновление: упаковка анимации в явной группировке не имела никакого значения. Включение setWantsLayer в Nib-файле также не имело значения, но интересно то, что когда я это делал, кнопки NSPopupupish исчезали до тех пор, пока не щелкнуло их содержащее представление. Установка Layer вручную на кнопки NSPopupup также не имеет значения.

Похоже, что у других была эта проблема, но я не могу найти опубликованных решений:

http://www.cocoabuilder.com/archive/message/cocoa/2008/3/30/202691 http://www.cocoabuilder.com/archive/message/cocoa/2008/4/25/205134

1 Ответ

4 голосов
/ 01 ноября 2008

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

[NSAnimationContext beginGrouping];
[[[self.myWindow contentView] animator] replaceSubview:previousView with:newView];
[NSAnimationContext endGrouping];

Кроме того, существует ли причина, по которой вы вызываете setWantsLayer: в awakeFromNib вместо того, чтобы просто устанавливать его в nib (в инспекторе NSView должен быть установлен флажок).

...