У меня странная проблема с поддержкой NSView с поддержкой слоев и ее братьями и сестрами, некоторые из них не отображаются правильно, когда добавляются в существующую иерархию представлений, прикрепленную к повернутому супервизу. Ниже приведены подробности.
Проблема
- NSScrollView (layer can be here)
- NSClipView (or here)
- Document View (or even here)
- Some *rotated* subview
- { Problematic sublings }
Итак, сама иерархия довольно проста и распространена: scrollview с некоторым документом, подвью документа представляют собой некоторый контент. В моем случае это графический контент, и он может быть повернут. У повернутых представлений может быть несколько дополнительных представлений - различные маркеры, контрольные точки и т.д., И там, где я сталкиваюсь с необычными проблемами с перекошенной графикой, когда я использую CALayer для внешнего сервера:
Изображения камеры отображаются отдельно, они не являются частью этого дерева представлений, обратите внимание на маркеры и кнопки.
Как вы можете видеть на изображении, у меня есть несколько тестовых представлений с subviews (просто случайные кнопки). Объект справа отображается правильно, всегда. Согласно моим тестам, каждый NSView с frameRotation между [0, pi/2]
отображает ОК. Объект слева отображается
размыто, похоже, что кеширующий буфер для этого элемента слишком мал. Это происходит, когда frameRotation находится в диапазоне [pi/2, pi]
.
Самая странная вещь
Эта проблема не возникает при "вращении в реальном времени". То есть если я просто изменил frameRoation иерархии настройки, с каждым подзоном на нем место, все работает нормально. Тем не менее, при подкреплении добавляется к уже повернутому объекту - он обходит и дает этот размытый вид.
В моем приложении специальное подвью появляется, когда пользователь нажимает на элемент, что "момент, когда брат добавляется в супервизор.
Похоже, что у back-end слоя есть некоторый буфер кэширования для subviews, и некоторые из них вычисляются с неправильным размером при повороте корневого представления.
Как это реализовано и что я пробовал
- Представления довольно простые и стандартные, я попытался нажать
[view setWantsLayer:YES]
на корневые представления иерархии: просмотр прокрутки, просмотр клипа, просмотр документа, каждый результат был таким же. нет ручных слоев, без хостов уровня. - Представления контента, братья и сестры и фактически все дерево представлений (кроме упомянутых выше представлений) не имеют слоев. Хотя, я попытался включить слои для различных элементов без каких-либо успехов.
- Я попытался принудительно обновить (setNeedsDisplay) фоновый слой без везения
- Повторное установление слоя полностью работает, но сильно отстает.
Решение?
Это вопрос, собственно. Кто-нибудь сталкивался с такой проблемой? Возможно, кто-то знает, как заставить слой сбросить все кеши и полностью обновиться? До сих пор у меня было только два решения: либо полностью удалить слои (работает, но и все лезвия), либо повторно установить слой, вызывающий setWantsLayer:NO
, за которым следует setWantsLayer:YES
. У этого есть ужасная производительность.