Как я могу прокрутить UIView неопределенного размера в UIScrollView - PullRequest
7 голосов
/ 22 декабря 2008

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

Я уже кеширую практически все, что могу, и в основном только вызываю CGContextAddLineToPoint в разделе -drawRect:. Я рисую только то, что видно на экране. У меня есть делегат UIScrollView, который прослушивает -scrollViewDidScroll:, который затем говорит графу перерисовать себя ([graphView setNeedsDisplay]).

Я нашел один метод, который говорит мне переопределить метод +layerClass и вернуть [CATiledLayer class]. Это позволяет графику на самом деле рисовать на устройстве, но он работает очень плохо. На самом деле рисовать невероятно медленно, а происходящее затухание нежелательно.

Есть предложения?

Ответы [ 4 ]

3 голосов
/ 24 декабря 2008

Хорошо, вот мой ответ: я в основном сделал нечто похожее на то, как UITableView работает с ячейками: у меня есть NSMutableSet объектов GraphView, которые хранят неиспользуемые графики. Когда часть вида прокрутки становится видимой, я беру график из этого набора (или создаю новый, если набор пустой). У него уже было свойство scrollX, чтобы определить, какая часть должна была быть нарисована. Я установил для свойства scrollX правильное значение и вместо использования ширины экрана выделил произвольную ширину для рисования. Когда он выходит из режима прокрутки, он удаляется из UIScrollView и добавляется в набор.

Интересно, а нужно ли мне вообще их удалять, когда они выходят из поля зрения? Может быть разумно попытаться оставить их и удалить те, которые не на экране, только если я получаю предупреждение о нехватке памяти? Это может избавить от паузы, когда потребуется перерисовать часть графика, которая не изменилась.

Моя спасительная грация заключалась в том, что мой GraphView уже был настроен для рисования только части графика. Все, что мне нужно было сделать, это просто сделать больше, чем один из них.

2 голосов
/ 22 декабря 2008

Я думаю, что это ограничение графического оборудования iPhone. В результате экспериментов я увидел, что iPhone откажется рисовать рамку, размер которой превышает 2000 пикселей по высоте или ширине. Это, вероятно, связано с ограниченным размером аппаратных кадровых буферов.

1 голос
/ 04 июля 2011

Посмотрите сессионный видеоролик WWDC 2011 года, озаглавленный «Сессия 104 - Расширенные способы просмотра с прокруткой».

0 голосов
/ 28 апреля 2009

Спасибо, это полезно. Один вопрос - что вы использовали для contentSize UIScrollView? UIScrollView допускает большие размеры контента (более 2000 пикселей), если вы не создаете буферы для заполнения всего пространства в вашем представлении контента? Или вы сохраняете постоянный размер UIScrollView (скажем, 2 ширины экрана) и сохраняете свойство UIScrollView contentOffset при каждом рисовании (используя scrollX вместо contentOffset для сохранения своей позиции)?

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

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