В этом ответе я приведу очень общий обзор того, как бы я подошел к вашей проблеме.
Создайте пользовательский подкласс вида прокрутки, скажем, TiledGridView
. Для простоты предположим, что интерфейс выглядит примерно так:
@interface TiledGridView : UIScrollView {
NSArray *tileData;
}
@property(retain) NSArray *tileData;
- (void)layoutSubviews;
@end
Массив tileData
содержит информацию о плитках (местоположение, размер и изображение). Вы устанавливаете tileData
, используя синтезированные средства доступа в простейшем случае. Вы можете создать ViewController, который фактически вычисляет позиции плиток, или вы можете добавить метод в представление. Для дальнейшего обсуждения предположим, что tileData
содержит все данные о плитках, которые нам нужны, и что мы уже знаем их позиции и т. Д.
Затем наиболее важной частью является переопределение сообщения layoutSubviews
в вашем подклассе. В layoutSubviews вы будете делать следующее:
- проверить границы
TiledGridView
- добавить
UIImageView
с (или что угодно) для плиток, которые находятся в этих пределах
- убрать плитки за пределы
Вы делаете это так, чтобы вам не хватало памяти, когда у вас много изображений. Это также то, что делает UITableView, но они даже повторно используют представления.
Псевдо-реализация может выглядеть примерно так:
- (void)layoutSubviews {
CGRect bounds = self.bounds;
for (id tile in tileData) {
if (/*tile is not yet visible and tile overlaps bounds*/) {
UIView newTileView = /* create the view for the tile */
[self insertSubview:newTileView atIndex:0];
} else if (/*tile is visible and no longer overlaps bounds*/) {
UIView oldTileView = /* fetch the corresponding view */
[oldTileView removeFromSuperview];
}
}
Это сделает ваш просмотр очень быстрым, поскольку подпредставления добавляются только по мере необходимости.