Как настроить цвет фона UITableViewCell? - PullRequest
186 голосов
/ 11 ноября 2008

Я хотел бы настроить фон (и, возможно, границу) всех UITableViewCells в моем UITableView. Пока я не смог настроить этот материал, поэтому у меня есть куча белых фоновых ячеек, которые по умолчанию.

Есть ли способ сделать это с помощью iPhone SDK?

Ответы [ 17 ]

204 голосов
/ 03 августа 2009

Вот наиболее эффективный способ, с которым я столкнулся, чтобы решить эту проблему, использовать метод делегата willDisplayCell (он заботится о белом цвете для фона текстовой метки, а также при использовании cell.textLabel.text и / или ячейки. detailTextLabel.text):

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { ... }

Когда вызывается этот метод делегата, цвет ячейки контролируется через ячейку, а не в виде таблицы, как при использовании:

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { ... }

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

if (indexPath.row % 2)
{
    [cell setBackgroundColor:[UIColor colorWithRed:.8 green:.8 blue:1 alpha:1]];
}
else [cell setBackgroundColor:[UIColor clearColor]];

Это решение хорошо сработало в моих обстоятельствах ...

191 голосов
/ 11 ноября 2008

Вам нужно установить backgroundColor для contentView ячейки в ваш цвет. Если вы используете аксессуары (например, стрелки раскрытия и т. Д.), Они будут выделены белым цветом, поэтому вам может понадобиться свернуть их версии.

104 голосов
/ 10 мая 2010

Это действительно просто, так как OS 3.0 просто устанавливает цвет фона ячейки в методе willDisplayCell. Вы не должны устанавливать цвет в cellForRowAtIndexPath.

Это работает как для простого, так и для группового стиля:

Код:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = [UIColor redColor];
}

P.S .: Вот выдержка из документации для willDisplayCell:

"Табличное представление отправляет это сообщение его делегат как раз перед тем, как он использует ячейку провести ряд, тем самым позволяя делегировать для настройки объекта ячейки прежде чем он отображается. Этот метод дает делегату возможность переопределить набор свойств на основе состояния ранее представлением таблицы, такой как Выбор и цвет фона. После делегат возвращается, табличное представление устанавливает только альфа и рамку свойства, и то только тогда, когда анимация строк по мере их скольжения или из ".

Я нашел эту информацию в этом посте от colionel . Спасибо ему!

57 голосов
/ 14 ноября 2008

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

Вот пример, где фон ячейки выделен желтым цветом:

UIView* backgroundView = [ [ [ UIView alloc ] initWithFrame:CGRectZero ] autorelease ];
backgroundView.backgroundColor = [ UIColor yellowColor ];
cell.backgroundView = backgroundView;
for ( UIView* view in cell.contentView.subviews ) 
{
    view.backgroundColor = [ UIColor clearColor ];
}
19 голосов
/ 17 апреля 2010

Просто поместите это в свой файл класса делегата UITableView (.m):

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell  forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UIColor *color = ((indexPath.row % 2) == 0) ? [UIColor colorWithRed:255.0/255 green:255.0/255 blue:145.0/255 alpha:1] : [UIColor clearColor];
    cell.backgroundColor = color;
}
7 голосов
/ 06 декабря 2010

Я согласен с Себой, Я пытался установить цвет чередующихся строк в методе делегата rowForIndexPath, но получал противоречивые результаты между 3.2 и 4.2. Следующее отлично сработало для меня.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    if ((indexPath.row % 2) == 1) {
        cell.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.textLabel.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }
    else
    {
        cell.backgroundColor = [UIColor whiteColor];
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }

}
6 голосов
/ 08 июня 2013

После опробования всех различных решений, следующий метод является наиболее элегантным. Измените цвет в следующем методе делегата:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (...){
        cell.backgroundColor = [UIColor blueColor];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
}
4 голосов
/ 04 марта 2009

vlado.grigorov дает несколько полезных советов - лучший способ - создать backgroundView и присвоить ему цвет, установив все остальное в clearColor. Кроме того, я думаю, что это единственный способ правильно очистить цвет (попробуйте его образец - но установите «clearColor» вместо «yellowColor»), что я и пытался сделать.

3 голосов
/ 02 февраля 2012

Чтобы расширить ответ Н. Берендта - Если вы хотите установить цвет ячейки на основе какого-либо состояния в фактическом объекте данных ячейки, в то время как вы конфигурируете остальную информацию для ячейки таблицы, которая обычно происходит, когда вы находятся в методе cellForRowAtIndexPath, вы можете сделать это, переопределив метод willDisplayCell, чтобы установить цвет фона ячейки из цвета фона представления содержимого - это решает проблему неправильного фона фона раскрытия и т. д., но все же позволяет контролировать цвет метод cellForRowAtIndexPath, где вы выполняете все другие настройки вашей ячейки.

Итак: Если вы добавите этот метод в свой делегат табличного представления:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = cell.contentView.backgroundColor;
}

Затем в вашем методе cellForRowAtIndexPath вы можете сделать:

if (myCellDataObject.hasSomeStateThatMeansItShouldShowAsBlue) {
    cell.contentView.backgroundColor = [UIColor blueColor];
}

Это избавляет от необходимости извлекать ваши объекты данных снова в методе willDisplayCell, а также экономит наличие двух мест, где вы выполняете настройку / настройку ячейки таблицы - все настройки можно выполнить в методе cellForRowAtIndexPath.

3 голосов
/ 28 сентября 2011

Создать вид и установить его как фоновое представление ячейки

UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
            [lab setBackgroundColor:[UIColor grayColor]];
            cell.backgroundView = lab;
            [lab release];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...