Как установить ширину ячейки в UITableView в сгруппированном стиле
Я работаю над этим около 2 дней, поэтому я думал, что поделюсь своими знаниями с вами.
вопрос: Можно ли сделать ширину ячейки сгруппированы UITableView меньше?
ответ: Нет.
но есть два способа обойти эту проблему.
Решение #1: более тонкая таблица Можно изменить рамку tableView, так что таблица будет меньше. Это приведет к UITableView рендеринга ячейки внутри с уменьшенной шириной.
решение может выглядеть так:
-(void)viewWillAppear:(BOOL)animated
{
CGFloat tableBorderLeft = 20;
CGFloat tableBorderRight = 20;
CGRect tableRect = self.view.frame;
tableRect.origin.x += tableBorderLeft; // make the table begin a few pixels right from its origin
tableRect.size.width -= tableBorderLeft + tableBorderRight; // reduce the width of the table
tableView.frame = tableRect;
}
решение #2: Наличие ячеек, отображаемых изображениями
это решение описано здесь:http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html
Я надеюсь, что эта информация будет полезной для вас. Мне потребовалось около 2 дней, чтобы попробовать много возможностей. Это то, что осталось.
7 ответов:
лучший и более чистый способ достичь этого-подкласс UITableViewCell и переопределение его
-setFrame:
способ такой:- (void)setFrame:(CGRect)frame { frame.origin.x += inset; frame.size.width -= 2 * inset; [super setFrame:frame]; }
почему лучше? Потому что два других-хуже.
изменить ширину таблицы в вид
-viewWillAppear:
прежде всего, это ненадежно, контроллер супервизора или родительского вида может настроить рамку представления таблицы дальше после
-viewWillAppear:
называется. Конечно, вы можете подкласс и переопределить-setFrame:
для вашего UITableView так же, как то, что я делаю здесь для UITableViewCells. Однако подклассы UITableViewCells-это очень распространенный, легкий и яблочный способ.во-вторых, если ваш UITableView имеет backgroundView, вы не хотите, чтобы его backgroundView был сужен вместе. Сохранение ширины backgroundView в то время как узкая ширина UITableView не является тривиальной работой, не говоря уже о том, что расширение подвидов за пределы своего супервизора не очень элегантная вещь, чтобы сделать в первом место.
пользовательский рендеринг ячеек, чтобы подделать более узкую ширину
для этого вам нужно подготовить специальные фоновые изображения с горизонтальными полями, и вы должны сами компоновать подвиды ячеек, чтобы разместить поля. Для сравнения, если вы просто измените ширину всей клетки, функциями автоматического изменения будет сделать все работы для вас.
чтобы сделать это в Swift, который не предоставляет методы для установки переменных, вам придется переопределить сеттер для
frame
. Первоначально опубликовано (по крайней мере, там, где я его нашел) здесьoverride var frame: CGRect { get { return super.frame } set (newFrame) { let inset: CGFloat = 15 var frame = newFrame frame.origin.x += inset frame.size.width -= 2 * inset super.frame = frame } }
Если ничего не работает вы можете попробовать это
сделайте цвет фона ячейки как чистый цвет, а затем поместите изображение ячейки с требуемым размером. Если вы хотите отобразить некоторый текст в этой ячейке, поместите метку над изображением. Не забудьте установить цвет фона метки также для очистки цвета.
Я обнаружил, что принятое решение не работает при вращении. Для достижения UITableViewCells с фиксированной шириной и гибкими полями я просто адаптировал вышеуказанное решение к следующему:
- (void)setFrame:(CGRect)frame { if (self.superview) { float cellWidth = 500.0; frame.origin.x = (self.superview.frame.size.width - cellWidth) / 2; frame.size.width = cellWidth; } [super setFrame:frame]; }
метод вызывается всякий раз, когда устройство вращается, поэтому ячейки всегда будут центрированы.
есть метод, который вызывается при повороте экрана: viewWillTransitionToSize
здесь вы должны изменить размер кадра. См. пример. Измените координаты кадра, как вам нужно.
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { [coordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context) { int x = 0; int y = 0; self.tableView.frame = CGRectMake(x, y, 320, self.tableView.frame.size.height); }]; }
Я делаю это
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell; CGFloat tableBorderLeft = self.view.frame.origin.x + 10; CGFloat tableBorderRight = self.view.frame.size.width - 20; CGRect tableRect = self.view.frame; tableRect.origin.x = tableBorderLeft; tableRect.size.width = tableBorderRight; tableView.frame = tableRect; }
и это сработало для меня