Лучший подход для рисования графика почти бесконечного размера в UIScrollView на iPad - PullRequest
1 голос
/ 09 декабря 2011

В настоящее время я работаю над приложением, которое должно рисовать s.th. как сетевой график. К сожалению, этот график может стать очень большим с тысячами подвижных объектов.

Я пытался поместить гигантский UIView в UIScrollView, но вскоре заметил, что это не сработает из-за ограничений памяти. Поэтому я попробовал другой подход: в настоящее время у меня есть UIView, который имеет размер видимой части UIScrollView. Вид прокрутки настроен так, чтобы не обрабатывать прокрутку (только сжатие). Вместо этого я занимаюсь прокруткой в ​​UIView. Каждый раз, когда пользователь выполняет прокрутку, все графические объекты (эти графические объекты в настоящее время являются просто подклассами NSObject, которые содержат пользовательский код для рисования) перемещаются, поэтому создается впечатление, что представление прокручивается. В drawRect я рисую только ту графику, которая видна в данный момент. Также я постоянно добавляю и удаляю подслои, если они перемещены в видимую рамку Это работает очень гладко даже с тысячами объектов.

К сожалению, у этого подхода есть некоторые недостатки:

  • Я не могу уменьшить масштаб, чтобы увидеть все объекты на графике, вместо этого пользователь может видеть только его часть

  • Я не получаю инерционную прокрутку, предлагаемую UIScrollView

Другие подходы, которые я пробовал, например CATiledLayer, тоже не работают, потому что все объекты на графике перетаскиваются пользователем, и это выглядит очень уродливо, если я использую CATiledLayer ... Поменять UIView с другими UIViews, пока пользовательские прокрутки могут помочь с инерционной прокруткой, но это делает все более сложным, и полное уменьшение все равно не будет работать: - (

Знаете ли вы какие-либо лучшие практики для рисования графиков, которые могут быть очень большими?

// edit: я закончил с uiscrollview, у которого есть subview, у которого есть слой cascroll, у которого есть много подслоев. При увеличении и уменьшении фрейма подпредставление uiscrollviews постоянно изменяется на границы uiscrollviews by view.frame = scrollview.bounds. При перетаскивании вида прокрутки слой прокрутки всегда вынужден прокручиваться до текущего смещения вида прокрутки. Мне нужно было создать подкласс uiscrollview и взломать его, чтобы заставить масштабирование работать хорошо, но теперь оно работает хорошо. Этот подход работает очень хорошо и позволяет создавать очень большие графики с большим количеством перетаскиваемых элементов.

// edit: см. Мой другой ответ ниже, описанный выше подход не сработал так, как я изначально думал, особенно в части увеличения

1 Ответ

0 голосов
/ 09 декабря 2011

CATiledLayer определенно то, что вам следует использовать здесь - на самом деле нет другого решения, которое позволило бы вам использовать Quartz / UIKit рисование на огромном масштабируемом холсте. Для всего, что должно быть интерактивным (перетаскиваемым, анимированным и т. Д.), Вы можете отключить его отображение в основном мозаичном слое и наложить поверх него другой вид или слой, который просто содержит объект, с которым взаимодействует.

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