2010-02-15 3 views
19

Я хотел бы создать сетку в моем приложении iPhone, подобном показанному в iPad photos app. Я знаю, что SDK iPhone 3.2 находится под NDA, но есть ли библиотека или структура, доступные для добавления такой функции (не SDK). В идеале я хотел бы, в конце концов, разработать iPad-версию приложения, где сетка будет 3-х позиций в портрете и 4 в пейзаже, но пока я хотел бы, чтобы 2 предмета были широко в портрете и 3 широких в ландшафте.Сетка в iPhone SDK

Единственный способ, которым я могу это сделать, - это подклассификация UITableView и создание пользовательской ячейки, которая создает 2 или 3 элемента. Это, однако, кажется грязным, и я уверен, что есть лучший способ.

Типичный элемент будет иметь изображение, ярлык и кнопку - ничего сложного.

Благодаря

ответ

9

Вы все еще можете использовать UITableView для этого, и вы не должны были бы подкласс. Как вы сказали, все, что вам нужно сделать, это создать свою собственную пользовательскую ячейку, которая не сложна. Не совсем беспорядочно :)

+0

Изображение будет отображаться в порядке, но что можно сделать i f Я хочу нажать на изображение. В этом случае вся строка будет выбрана не единственным UIView внутри пользовательского UITableViewCell. – vikmalhotra

+2

использовать UITapGestureRecognizer, прикрепленный к каждому UIImageView, а не используя didSelectRowAtIndexPath – Doug

25

Для iOS 6 и выше рекомендую UICollectionView и PSTCollectionView.

Цель состоит в том, чтобы использовать PSTCollectionView на прошивке 4/5 в качестве запасного варианта и переключателя в UICollectionView на iOS6. Мы даже используем определенные трюки во время выполнения , чтобы создать UICollectionView во время выполнения для более старых версий iOS. В идеале вы просто связываете файлы, и все работает на более старых системах .

В 2010 году я рекомендовал AQGridView

+0

Я хотел бы добавить, что в настоящий момент режим горизонтальной компоновки прослушивается. Если вы используете эту функцию, подумайте об использовании чего-то другого. – Nailer

+0

@Nailer, я немного обновил свой ответ, чтобы рекомендовать UICollectionView вместо AQGridView. – catlan

10

Я знаю, что это очень старое, но я искал ответ на этот и протестировал несколько решений. Я обнаружил, что GMGridView был одним из лучших, наименее ошибочных решений. Проверьте это на https://github.com/gmoledina/GMGridView.

+0

С этого поста, я недавно переключился на использование KKGridView в своих проектах. Проверьте это на странице https://github.com/kolinkrewinkel/KKGridView. – morcutt

+0

Упомяните, почему вы переключились? Просто интересуйтесь различиями. – Nailer

+0

@morcutt Я использовал GMGridView и нашел его очень хорошим (пока). Хотелось бы также узнать, почему вы переключились. –

-1

Я бы рекомендовал использовать пользовательские UITableViewCells. В iOS 5 вам не нужно подклассифицировать их. Просто добавьте tableView в свой проект, добавьте прототип ячеек (= пользовательская ячейка) с помощью Xcode в tableView, дайте им уникальный идентификатор и используйте этот идентификатор в cellForRowAtIndexPath, чтобы удалить и создать экземпляр вашей пользовательской ячейки. Затем установите ячейку и верните ее.

1

NRGridView кажется лучшим способом. Вы можете найти его here.

Он имеет аналогичные методы, такие как UITableView. Ячейки могут быть настроены по мере необходимости.

2

Чтобы сделать простой вид сетки в вашем представлении таблицы создать класс «GridViewCell» и в файле заголовка добавьте:

@interface GridViewCell : UITableViewCell 

@property (nonatomic, strong) UIButton *column1; 
@property (nonatomic, strong) UIButton *column2; 
@property (nonatomic, strong) UIButton *column3; 

@end 

в .m файл добавить этот код:

#define CELL_WIDTH 100 
#define CELL_HEIGHT 80 

#import "GridViewCell.h" 

@implementation GridViewCell 

@synthesize column1, column2, column3; 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
if (self) { 
    column1 = [[UIButton alloc] initWithFrame:CGRectMake(5, 5, CELL_WIDTH, CELL_HEIGHT)]; 
    [self addSubview:column1]; 
    column2 = [[UIButton alloc] initWithFrame:CGRectMake(CELL_WIDTH+ 10, 5, CELL_WIDTH, CELL_HEIGHT)]; 
    [self addSubview:column2]; 
    column3 = [[UIButton alloc] initWithFrame:CGRectMake(CELL_WIDTH + CELL_WIDTH + 15, 5, CELL_WIDTH, CELL_HEIGHT)]; 
    [self addSubview:column3]; 
} 
return self; 
} 

@end 

и при создании ваш стол использует новый класс «GridView» в делегате cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    GridViewCell *cell = (GridViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[GridViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 
    [cell.column1 setBackgroundColor:[UIColor blackColor]]; 
    [cell.column2 setBackgroundColor:[UIColor blackColor]]; 
    [cell.column3 setBackgroundColor:[UIColor blackColor]]; 

    return cell; 
} 
+0

Это также самый простой способ, с которым я могу думать, без использования UICollectionView (доступно только с iOS 6) или сторонних библиотек. Но я также читаю исходный код этих 3-ей библиотек, чтобы увидеть, что есть лучший способ, но они кажутся более сложными для понимания. Не уверен, что я пропустил какую-либо ключевую часть. –