Как установить ширину ячейки в UITableView в сгруппированном стиле
Я работаю над этим около двух дней, поэтому я решил поделиться своими знаниями с вами.
Возникает вопрос: возможно ли уменьшить ширину ячейки в сгруппированном UITableView?
Ответ: Нет.
Но есть две возможности решить эту проблему.
Решение №1: более тонкая таблица
Можно изменить рамку таблицыView, чтобы таблица была меньше. Это приведет к тому, что 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
Я надеюсь, что эта информация поможет вам. Мне потребовалось около двух дней, чтобы попробовать множество возможностей. Это то, что осталось.
Ответы
Ответ 1
Лучшим и более чистым способом достижения этого является подклассификация UITableViewCell и переопределение его метода -setFrame:
следующим образом:
- (void)setFrame:(CGRect)frame {
frame.origin.x += inset;
frame.size.width -= 2 * inset;
[super setFrame:frame];
}
Почему это лучше? Потому что два других хуже.
-
Отрегулируйте ширину таблицы в -viewWillAppear:
Прежде всего, это ненадежно, супервизор или контроллер родительского представления могут корректировать ракурс таблицы далее после вызова -viewWillAppear:
. Конечно, вы можете подклассифицировать и переопределить -setFrame:
для вашего UITableView так же, как и то, что я здесь делаю для UITableViewCells. Однако подклассификация UITableViewCells - это очень распространенный, легкий и Apple способ.
Во-вторых, если ваш UITableView имеет backgroundView, вы не хотите, чтобы его backgroundView суживался вместе. Сохранение ширины backgroundView при узкой ширине UITableView - это не тривиальная работа, не говоря уже о том, что расширение subviews за пределами своего супервизора не является очень изящной задачей, чтобы сделать в первую очередь.
-
Пользовательская рендеринг ячеек для более узкой ширины
Чтобы сделать это, вам нужно подготовить специальные фоновые изображения с горизонтальными полями, и вам нужно самостоятельно подобрать объекты для размещения полей.
Для сравнения, если вы просто отрегулируете ширину всей ячейки, авторезизация сделает все ваши работы.
Ответ 2
Чтобы сделать это в Swift, который не предоставляет методы для установки переменных, вам придется переопределить setter для 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
}
}
Ответ 3
Если ничего не работает, вы можете попробовать это
Сделайте цвет фона ячейки прозрачным, а затем поместите изображение ячейки с требуемым размером. Если вы хотите отобразить какой-либо текст на этой ячейке, поместите надпись над изображением. Не забудьте установить цвет фона на ярлыке и очистить цвет.
Ответ 4
Я нашел, что принятое решение не срабатывало при вращении. Чтобы достичь 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];
}
Метод вызывается всякий раз, когда устройство вращается, поэтому ячейки всегда будут центрироваться.
Ответ 5
Существует метод, который вызывается при повороте экрана: 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);
}];
}
Ответ 6
Я делаю это в
- (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;
}
И это сработало для меня
Ответ 7
В .h файле добавьте делегат 'UITableViewDataSource'
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return size;
}