Я бы сделал объект GridView нисходящим из UIView. Это будет иметь свойство numberOfColumns и свойство items:
@class GridView : UIView {
NSUInteger numberOfColumns;
NSArray *items;
}
@property (nonatomic, assign) NSUInteger numberOfColumns;
@property (nonatomic, copy) NSArray *items;
@end
Массив items будет содержать UIViews, которые вы хотите отобразить в виде сетки.
Затем каждый раз, когда задается свойство numberOfColumns или свойство items, вы также вызываете [self setNeedsLayout]; в их установщике, т. е. для свойства items вы удалите старые, добавите новые и скажите фреймворку, что вам нужно ретранслировать
- (void)setItems:(NSArray *)value {
if (value != items) {
for (UIView *item in items)
[item removeFromSuperview];
[items release];
items = [value copy];
for (UIView *item in items)
[self addsubview:item];
[self setNeedsLayout];
}
}
Ваш метод layoutSubviews будет перебирать массив элементов и размещать их в правильном количестве столбцов, т.е. что-то вроде
- (void)layoutSubviews {
[super layoutSubviews];
CGFloat width = [slef frame].size.width / numberOfColumns;
CGFloat height = width;
CGFloat xoffset = 0;
CGFloat yoffset = 0;
for (UIBView *item in items) {
[item setFrame:CGRectMake(xoffset, yoffset, width, height)];
xoffset += width;
if (xoffset >= [self frame].size.width) {
xoffset = 0;
yoffset += height;
}
}
}
Я не тестировал этот код, но он должен располагать элементы в сетке, где каждый элемент квадратный.
Надеюсь, это хорошая отправная точка.