Как CATiledLayer узнает, когда предоставить новую плитку? - PullRequest
4 голосов
/ 09 сентября 2011

По разным причинам я планирую сделать собственную реализацию CATiledLayer.Я провел некоторое исследование, но я не могу понять, как CATiledLayer знает, какую плитку предоставить.Например, когда вы прокручиваете слой, setPosition: или setBounds: никогда не вызываются.Похоже, что фоновый поток просто вызывает drawLayer: inContext: делегата на ровном месте без каких-либо триггеров.Я обнаружил, что CATiledLayer вызывает setContent: с экземпляром «CAImageProvider», и все вызовы drawLayer: inContext: происходят из этого класса.Так что, вероятно, именно этот ключ определяет, какую плитку рисовать.Но я не могу найти никакой документации по этому классу.

Итак ... кто-нибудь знает, как это работает, и как я могу переопределить это?

Что касается недостатков CATiledLayer:

  • всегда используется разрешение экрана (или x2, x4 и т. Д.);вы не можете установить его на собственное разрешение ваших исходных изображений
  • вы не можете указать любой другой коэффициент масштабирования, кроме 2
  • вы должны указать уровниOofDetail и levelsOfDetailBias, для которых я не вижу причин реализациивсе.Если у вас есть контент, который можно бесконечно масштабировать, например, фракталы, то это очень ограничивает.
  • самое главное: если вы ограничиваете его масштабированием только в одном направлении (я делаю это, применяя масштабный коэффициент одного направления к1 в setTransform :), действует странно

1 Ответ

1 голос
/ 09 сентября 2011

В drawLayer:inContext: вы можете получить ограничивающий прямоугольник, используя CGContextGetClipBoundingBox.CGContextGetCTM должен предоставить вам информацию о текущем разрешении.

...