iPhone / iPad SDK: домашний экран / вид сетки в стиле фотографий?

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


Чего я пытаюсь достичь:

http://dl.getdropbox.com/u/413086/mzl.nbioluoe.480x480-75.jpg

(ссылка iTunes)

Есть ли в SDK готовый способ сделать это? Если нет, то как мне создать свой собственный?

Обновление: я думаю, что понимаю, как сделать базовое расположение «объектов» в сетке, но я не знаю, как заставить это работать с тысячами объектов и прокручиваемым представлением, не используя тонны памяти и делая все очень медленным. (опять же, у меня до сих пор нет устройства для тестирования).



Обновление 2:

Полмесяца спустя я наконец нашел идеальное решение: AQGridView.


person igul222    schedule 02.04.2010    source источник


Ответы (4)


Используйте или производный от UIScrollView для представления, содержащего все плитки. Либо реализуйте метод делегата - (void)scrollViewDidScroll:(UIScrollView *)scrollView;, либо переопределите метод - (void)setContentOffset:(CGPoint)contentOffset. Установите размер содержимого прокрутки, как если бы присутствовали все плитки.

Когда вид прокрутки прокручивается, выясните, какие плитки будут отображаться на экране. Затем либо используйте схему повторного использования, как это делает UITableView с ячейками, либо просто добавляйте вновь созданные плитки по мере необходимости и удаляйте те, которые находятся дальше всего от видимой области, когда вы достигли своей квоты памяти. В вашем примере показаны плитки 2x3, полностью видимые, поэтому вам необходимо сохранить как минимум плитки 4x5.

Если у вас есть два столбца плиток и нет горизонтальной прокрутки (не ясно из рисунка), вы можете просто использовать UITableView напрямую и реализовать пользовательскую UITableViewCell, которая отображает две плитки.

Если вы наследуете UIScrollView, лучше всего будет отразить интерфейс, используемый UITableView, с помощью dataSource и делегировать обратные вызовы. У вас будет numberOfRows:, numberOfColumns: и tileForRow:column: вместо numberOfRows:, numberOfSections: и cellForIndexPath:, но принцип тот же. Похоже, вы можете использовать плитки фиксированного размера, что значительно упрощает работу.

person drawnonward    schedule 10.04.2010
comment
Спасибо - это очень помогло. В моей реализации я поместил код макета в layoutSubviews моего подкласса UIScrollView, который, похоже, работает нормально. Есть ли какая-то конкретная причина, по которой вы предлагаете мне реализовать scrollViewDidScroll:? - person igul222; 10.04.2010
comment
У вас был выбор: унаследоваться от UIScrollView или быть делегатом. Если бы вы решили быть делегатом ванильного UIScrollView, вы могли бы выполнить макет в scrollViewDidScroll. - person drawnonward; 11.04.2010
comment
Ах хорошо. Понятно! Для справки: переопределение layoutSubviews доставляло мне большие проблемы при выполнении анимации и т. Д. Реализация scrollViewDidScroll в качестве делегата все исправляет. - person igul222; 18.04.2010

Я предлагаю использовать библиотеку Three20 и адаптировать контроллер представления TTLauncher.

person dwery    schedule 09.04.2010

Я не знаю ни одного готового способа сделать это, но обычно есть два подхода, которые вы хотели бы использовать:

1) Если сетка не будет (на самом деле) меняться, вы можете просто создать ее прямо в конструкторе интерфейсов.

2) Если вам нужен более гибкий подход, вы можете программно построить сетку в UIViewController, вычислив соответствующую позицию каждого элемента. Например:

for(int i=0 ; i<num_rows ; i++) {
    for(int j=0 ; j<num_cols ; j++) {
        UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(j*50, i*50, 40, 40)] ;
        [self.view addSubview:myView] ;
        [myView release] ;
    }
}
person drootang    schedule 05.04.2010
comment
Замените UIView любым пользовательским подклассом UIView. - person drootang; 05.04.2010
comment
Я думал о № 2 ранее, но моя проблема возникает при работе с тысячами элементов, прокруткой и т. Д. Нужно ли мне перестраивать вещь в стиле UITableView? - person igul222; 06.04.2010

Вы можете использовать UITableView и иметь строки без линий между ними и использовать четыре разных типа строк, каждая из которых содержит два подпредставления. Это будет иметь дело со всем кешированием представлений для вас. Затем вы можете игнорировать didSelect... и просто реализовать касания для представлений, которые вы добавляете в contentView ячеек.

person Felix Lamouroux    schedule 10.04.2010