UIScrollView - как рисовать контент по требованию? - PullRequest
2 голосов
/ 30 марта 2011

Я хочу создать представление с прокруткой с огромным размером содержимого, которое будет отображать содержимое внутри него.Контент будет в основном текстовым (несколько небольших изображений будут нарисованы для границ контента).

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

Производительность имеет решающее значение в этом приложении, поэтому я думаю, что я должен избегать использования UILabels или любых UIViews вообще в представлении прокрутки.

Как я могу нарисовать эти метки, когда пользователь прокручивает?Некоторые варианты, которые я рассмотрел:

  1. переопределить drawRect: в представлении прокрутки и нарисовать все в пределах окна - похоже, это будет очень медленно.Иногда drawRect вызывается только с разницей в 1 пиксель.
  2. То же самое, но следите за тем, какие из них я уже нарисовал
  3. Нарисуйте их как-нибудь "снаружи", как делегат вида с прокруткой - Я не могу понять, как использовать [@ "mystring" drawInRect:] вне drawRect: (проблемы контекста)

Есть ли что-то, о чем я не подумал?Я знаю, что виды прокрутки были разработаны для того, чтобы справиться с такой проблемой, но я не уверен, что такое спроектированный способ.Спасибо!

1 Ответ

4 голосов
/ 30 марта 2011

Стандартный способ добиться этого в приложении для iPhone - создать обычный UIScrollView того размера, который вам нужен, и заполнить его либо напрямую CATiledLayer , если вы чувствуете себя смелым или с пользовательским подклассом UIView, который использует CATiledLayer и реализует - (void)drawLayer:(CALayer*)layer inContext:(CGContextRef)context.

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

Примером, на который обычно указывают люди, является этот , но если вы новичок в реализации собственных подклассов UIView, то, возможно, стоит посмотреть, например. этот урок . Затем посмотрите на свойство + layerClass в UIView и различные свойства CATiledLayer (который, я думаю, вам также может понадобиться создать подкласс, поскольку + fadeDuration является методом класса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...