Layer Backed Views и мерцающие элементы управления
У меня есть окно, которое содержит элемент управления NSBox. В этом NSBox есть несколько других элементов управления (всплывающие окна, текстовые поля и т. Д.)
У меня есть два других NSBox в том же NIB-файле, которые заполнены элементами управления, которые я хотел бы поменять с первым при определенных условиях. Я бы хотел, чтобы это происходило с хорошим эффектом перекрестного затухания, поэтому я делаю следующее:
В NSWindowController's -awakeFromNib
метод:
[[self.myWindow contentView] setWantsLayer:YES];
В моем методе, где я переключаю представления, я использую этот код:
[[[self.myWindow contentView] animator] replaceSubview:previousView with:newView];
Это работает просто отлично, взгляды пересекаются, как я и ожидал. Проблема в том, что элементы управления в представлениях иногда исчезают без видимой причины. Это не всегда одни и те же представления (хотя кнопки NSPopUpButton кажутся особенно склонными к этому), и они обычно появляются снова, когда имеют фокус.
Нужно ли делать резервные копии всех слоев управления?
Обновление: упаковка анимации в явной группировке не имела никакого значения. Включение setWantsLayer в Nib-файле также не имело значения, но интересно то, что когда я это делал, кнопки NSPopupup пропадали до тех пор, пока не щелкнуло их содержащее представление. Установка 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 ответ
Если представление поддерживается слоем, то все его подпредставления будут поддерживаться слоем, так что вам не нужно вручную устанавливать их для поддержки слоя. Я не знаю, достаточно ли информации, чтобы увидеть, что здесь происходит, но мне было бы любопытно, если бы у вас было другое поведение, если вы оборачиваете анимацию в группу экспликатов:
[NSAnimationContext beginGrouping];
[[[self.myWindow contentView] animator] replaceSubview:previousView with:newView];
[NSAnimationContext endGrouping];
Кроме того, есть ли причина, по которой вы вызываете setWantsLayer: в awakeFromNib вместо того, чтобы просто устанавливать его в nib (должен быть установлен флажок в инспекторе NSView).