Как установить ширину ячейки в UITableView в сгруппированном стиле - PullRequest
107 голосов
/ 29 марта 2010

Я работаю над этим около 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 ]

225 голосов
/ 06 сентября 2011

Лучшим и более чистым способом достижения этого является создание подкласса UITableViewCell и переопределение его -setFrame: метода следующим образом:

- (void)setFrame:(CGRect)frame {
    frame.origin.x += inset;
    frame.size.width -= 2 * inset;
    [super setFrame:frame];
}

Почему это лучше? Потому что два других хуже.

  1. Настройка ширины табличного представления в -viewWillAppear:

    Прежде всего, это ненадежно, контроллер суперпредставления или родительского представления может настроить кадр представления таблицы дальше после вызова -viewWillAppear:. Конечно, вы можете создать подкласс и переопределить -setFrame: для вашего UITableView так же, как я делаю здесь для UITableViewCells. Тем не менее, создание подклассов UITableViewCells является довольно распространенным, легким способом Apple.

    Во-вторых, если ваш UITableView имеет backgroundView, вы не хотите, чтобы его backgroundView сужался вместе. Сохранение ширины backgroundView при уменьшении ширины UITableView - это не тривиальная работа, не говоря уже о том, что расширение подпредставлений за пределы его суперпредставления - это не очень элегантная вещь.

  2. Пользовательский рендеринг ячейки для имитации более узкой ширины

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

13 голосов
/ 18 января 2016

Чтобы сделать это в 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
    }
}
9 голосов
/ 28 декабря 2010

Если ничего не работает, вы можете попробовать это

Сделайте цвет фона ячейки прозрачным, а затем поместите изображение ячейки нужного размера. Если вы хотите отобразить текст в этой ячейке, поместите метку над изображением. Не забудьте также установить цвет фона этикетки, чтобы он был прозрачным.

8 голосов
/ 25 января 2013

Я обнаружил, что принятое решение не работает при ротации. Чтобы получить 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];
}

Метод вызывается всякий раз, когда устройство вращается, поэтому ячейки всегда будут центрированы.

0 голосов
/ 11 марта 2017

Существует метод, который вызывается при повороте экрана: 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);
    }];
}
0 голосов
/ 05 августа 2015

я делаю это за

- (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;
}

И это сработало для меня

0 голосов
/ 24 декабря 2010

В файле .h добавьте делегата 'UITableViewDataSource'

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    return size;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...