UICollectionView
/ UITableView
не будет работать, потому что ячейки почти всегда имеют одинаковую ширину/высоту. Самое главное, что ячейки всегда имеют одинаковый интервал между ячейками. Из-за этого он может легко вычислить диапазон индекса и запросить dataSource
для необходимой ячейки на основе индекса.
С другой стороны, представление временной шкалы сильно отличается от этих элементов управления. Расстояние между ячейками разное, иногда ячейки перекрывают друг друга. Если бы у вас был источник данных, отсортированный по положению, элемент управления все равно должен был бы угадать, с чего начать поиск диапазона. Таким образом, поиск правильного диапазона индексов будет более дорогим — вам просто нужно найти правильный алгоритм, чтобы определить это за более короткий промежуток времени.
Вам придется создать свой собственный элемент управления, создав подкласс UIScrollView
. Вам вообще не стоит связываться с drawRect
. Важным понятием, используемым UITableView
и UICollectionView
, является удаление ячеек из очереди. Версия Apple PhotoScroller для iOS 5 демонстрирует это. концепция с пейджингом (версия iOS 6 заменяет пользовательское пейджинг на UIPageViewController
). Вам нужно будет загрузить старую документацию, чтобы получить старый пример кода.
В настоящее время я создаю представление временной шкалы, исходный код которого я открою в какой-то момент. Он немного основан на UITableView
и работает в горизонтальном или вертикальном направлении. Он удаляет ячейки из очереди так же, как UITableView
. Я сосредотачиваюсь не на метках или масштабировании, а на концепции наличия непостоянного расстояния между ячейками. Чтобы дать вам преимущество, вот мои методы источника данных, на которых я остановился:
- (NSInteger)numberOfCellsInTimelineView:(TimelineView *)timelineView;
- (CGRect)timelineView:(TimelineView *)timelineView cellFrameForIndex:(NSInteger)index;
- (TimelineViewCell *)timelineView:(TimelineView *)timelineView cellForIndex:(NSInteger)index;
Два из этих вызовов идентичны тому, что есть у UITableView
, но у него есть новый вызов с именем cellFrameForIndex
. Что важно в этом вызове, так это то, что TimelineView может угадывать индекс и искать кадр ячейки и видеть, где он помещается в видимых границах. Если он угадывает ячейку внутри видимых границ, он может просто выполнять итерацию вперед и назад, пока не найдет края.
В настоящее время алгоритм, который я использую, принимает round(count * (CGRectGetMidX(timelineView.bounds) / timelineView.contentSize.width))
(для горизонтального направления). По сути, это берет среднюю точку видимых границ UIScrollView и получает процент того, что было прокручено. Затем он умножает это на количество ячеек. Это работает достаточно хорошо. При тестировании случайного набора данных со 100 000 записей со случайным интервалом количество вызовов cellFrameForIndex
варьировалось от 8 до 150. С этим я могу добиться 52-60 кадров в секунду. Я все еще работаю над этим и пытаюсь найти лучший/быстрый способ определить диапазон индекса. Я пытаюсь уменьшить количество видимых ячеек + 10 (максимум) итераций.
Если у вас есть время подождать, я обновлю свой ответ, включив ссылку на мой проект GitHub, когда закончу. Это может быть от нескольких дней до недели. Могу добавить масштабирование. Но вам придется разветвить его и добавить метки и все, что вы хотите.
Изменить:
Вот мой проект на Github: https://github.com/lukescott/TimelineView
person
Luke
schedule
06.03.2013