Подтвердить что ты не робот

Скрытая спина NSView и перекошенные братья и сестры

У меня странная проблема с поддержкой NSView с поддержкой слоев и ее братьями и сестрами, некоторые из них не отображаются правильно, когда добавляются в существующую иерархию представлений, прикрепленную к повернутому супервизу. Ниже приведены подробности.

Проблема

- NSScrollView (layer can be here)
  - NSClipView (or here)
    - Document View (or even here)
      - Some *rotated* subview
        - { Problematic sublings }

Итак, сама иерархия довольно проста и распространена: scrollview с некоторым документом, подвью документа представляют собой некоторый контент. В моем случае это графический контент, и он может быть повернут. У повернутых представлений может быть несколько дополнительных представлений - различные маркеры, контрольные точки и т.д., И там, где я сталкиваюсь с необычными проблемами с перекошенной графикой, когда я использую CALayer для внешнего сервера: Issue illustration

Изображения камеры отображаются отдельно, они не являются частью этого дерева представлений, обратите внимание на маркеры и кнопки.

Как вы можете видеть на изображении, у меня есть несколько тестовых представлений с subviews (просто случайные кнопки). Объект справа отображается правильно, всегда. Согласно моим тестам, каждый NSView с frameRotation между [0, pi/2] отображает ОК. Объект слева отображается размыто, похоже, что кеширующий буфер для этого элемента слишком мал. Это происходит, когда frameRotation находится в диапазоне [pi/2, pi].

Самая странная вещь

Эта проблема не возникает при "вращении в реальном времени". То есть если я просто изменил frameRoation иерархии настройки, с каждым подзоном на нем место, все работает нормально. Тем не менее, при подкреплении добавляется к уже повернутому объекту - он обходит и дает этот размытый вид.

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

Похоже, что у back-end слоя есть некоторый буфер кэширования для subviews, и некоторые из них вычисляются с неправильным размером при повороте корневого представления.

Как это реализовано и что я пробовал

  • Представления довольно простые и стандартные, я попытался нажать [view setWantsLayer:YES] на корневые представления иерархии: просмотр прокрутки, просмотр клипа, просмотр документа, каждый результат был таким же. нет ручных слоев, без хостов уровня.
  • Представления контента, братья и сестры и фактически все дерево представлений (кроме упомянутых выше представлений) не имеют слоев. Хотя, я попытался включить слои для различных элементов без каких-либо успехов.
  • Я попытался принудительно обновить (setNeedsDisplay) фоновый слой без везения
  • Повторное установление слоя полностью работает, но сильно отстает.

Решение?

Это вопрос, собственно. Кто-нибудь сталкивался с такой проблемой? Возможно, кто-то знает, как заставить слой сбросить все кеши и полностью обновиться? До сих пор у меня было только два решения: либо полностью удалить слои (работает, но и все лезвия), либо повторно установить слой, вызывающий setWantsLayer:NO, за которым следует setWantsLayer:YES. У этого есть ужасная производительность.

4b9b3361

Ответ 1

Вы написали, что попробовали "setNeedsDisplay". Вы вызываете этот метод из основного потока? В одном из моих приложений ничего не произошло, если я вызвал setNeedsDisplay из другого потока. Если вы хотите удостовериться, что дисплей недействителен, используйте диспетчер, например:

dispatch_async(dispatch_get_main_queue(), ^{

       [view setNeedsDisplay:YES];
});

Кроме того, посмотрите на своего инспектора IB. Иногда представления с поддержкой слоев не любят смешиваться с представлениями, не поддерживающими слой. Удостоверьтесь, что в поддержке "Inspector View Effects" поддержка уровней включена для всех подпрограмм вашего корневого слоя.

(В моей программе иногда NSButtons исчез, если поддержка слоя была отключена)