Как установить ширину ячейки в 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 является довольно распространенным, легким способом Apple.Во-вторых, если ваш 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;
}
И это сработало для меня
В.h файл добавьте делегата 'UITableViewDataSource'
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
return size;
}