CALayers не отображаются при первом рисовании - PullRequest
4 голосов
/ 10 августа 2010

Я боролся со странной проблемой, которая возникла при использовании инфраструктуры CorePlot, но я подозреваю, что это не ошибка самой платформы. Я надеюсь, что кто-то здесь увидит что-то подобное, и может направить меня в продуктивном направлении.

У меня есть представление с вкладками, в котором отображаются графики. Первоначально активная вкладка не имеет проблем вообще, но часто, когда я открываю следующую вкладку, я вижу следующее:

http://imgur.com/J0VDs.png

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

  1. Вид активен перед созданием графика; и
  2. Вызывается метод drawInContext: для каждой метки, включая те, которые отсутствуют. На самом деле, метки осей являются одними из последних отображаемых элементов, поэтому я ожидаю, что они покажут, если что-то произойдет, и некоторые из отсутствующих меток будут отображаться после (и до) тех, которые присутствуют.

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 23 января 2017

Шесть лет спустя, и я столкнулся с той же самой проблемой. При создании слоя первый раз вокруг него может быть еще не нарисован на экране, когда это необходимо в анимации. Второй раз вокруг это.

Простое решение - вызвать .layoutIfNeeded() на слое, который вы пытаетесь нарисовать, сразу после добавления его в суперслой.

0 голосов
/ 10 августа 2010

CALayer, возможно, не кэширует содержимое вовремя, прежде чем CALayer будет фактически извлечен.

Не видя код, я бы посоветовал попытаться вызвать -setNeedsDisplay для CALayer, в котором отсутствует информация метки, как только вы изменили содержимое этого CALayer.

...