2013-10-11 2 views
0

У меня есть приложение IOS, предназначенное для ipad. На одной странице я показываю отчет пользователю, и для отчета требуется 5000 UILabels, которые будут отображаться на экране внутри UIScrollView. Это приводит к сбою приложения из-за нехватки памяти. Я знаю, что UITableView имеет функциональность для загрузки контента по требованию. Как сделать просмотр прокрутки рендерингом только определенного контента, и по мере прокрутки удаляется содержимое, которое становится невидимым, и добавляет контент, который должен быть видимым?Как сделать загрузку данных UIScrollView при прокрутке

+1

То, что вы запросили, является именно точкой использования UITableView или UICollectionView. Вы должны использовать их вместо UIScrollView, и вы можете обрабатывать любое количество элементов данных. –

+0

У меня есть требование использовать UIScrollView. В противном случае я не стал бы задавать этот вопрос. – neo

+0

было бы полезно понять, почему вы должны использовать UIScrollView. вы собираетесь написать много настраиваемой логики, чтобы получить ту же функциональность, которая уже встроена в коллекции. –

ответ

0

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

Возможно, вы можете быть более конкретным на вашем экране?

+0

Нет. Использование UIScrollView является обязательным требованием. – neo

0

Вы должны повторно использовать цикл (например, повторно использовать), чтобы метки, подобные виду таблицы, перерабатывали свои ячейки таблицы. Это иногда называют «черепичными» подзонами. Плитка позволяет отображать больше, чем вписывается в память.

Я рекомендую посмотреть сеанс WWDC 2012 года 104. Учебное пособие этой сессии создает приложение для фото, которое отображает изображения в UIScrollView. Хотя приложение «Фотография» прокручивает страницы контента, а не сетку элементов, я думаю, что видео может иметь отношение к вашему приложению.

Вот очень краткий обзор руководства применительно к вашему конкретному случаю:

(1.) объявить Иварс, отслеживающие этикеток:

NSMutableSet *recycledLabels; 
NSMutableSet *visibleLabels; 

(2.) реализовать метод, извлекает многоразовую этикетку:

- (UILabel *)dequeueRecycledLabel;

(3.) реализовать способ, который делает черепицу:

- (void)tileLabels; // this will add/remove labels from the scroll view 

(4.) установить делегата на ваш взгляд скроллинга и вызвать tileLabels в scrollViewDidScroll: метод делегата

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    [self tileLabels]; 
} 

видео WWDC поможет вам заполнить в деталях, которые я думаю, применимы к вашему делу , Тем не менее, вам нужно будет сделать много импровизации, чтобы заставить его работать для вашего конкретного случая. Это может быть нелегко; но его выполнимость.

В конце видео обсуждается черепица с использованием CATileLayer. Я буду честен, я не понял эту часть. Но я не думаю, что это применимо в вашем случае, потому что вы не показываете большие изображения.

+0

Я не смог найти видео. Не могли бы вы предоставить url? – neo

0

Я, наконец, реализовал динамическую загрузку контента. Реализованный метод: scrollViewDidScroll. Внутри этого метода я определил направление прокрутки по следующей

bool isUp = (currentOffset.y > lastScrollOffset); 

Затем я определил видимый прямоугольник содержимого с помощью следующего.

CGRect visibleContentRect; 
visibleContentRect.origin = scrollView.contentOffset; 
visibleContentRect.size = scrollView.bounds.size; 

Тогда я был массив элементов View, и каждый знал свое место в представлении прокрутки из-за их рамки быть установлены. Короче говоря, каждый раз, когда прокручивался свиток, я определял представления, чей кадр пересекался или содержался в видимом кадре контента.Я добавил эти представления в список прокрутки. Я также определил те, которые исчезли и удалили их из прокрутки, и я также установил эти взгляды на ноль и воссоздал их. Как только [scrollView addSubview: view] вызывается метод, тогда просмотр получает больше места в памяти, потому что он становится видимым. [view removeFromSuperView] способ не освобождает это пространство. Вот почему установка представления на нуль и повторное создание необходимо.

Смежные вопросы