Как настроить цвет фона UITableViewCell?

188

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

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

JPM
источник

Ответы:

193

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

Бен Готлиб
источник
108
например, myCell.contentView.backgroundColor = [UIColor greenColor];
JoBu1324
1
vlado.grigorov ответ более гибок - см. ответ Уильяма Денниса
JoBu1324
3
UITableViewCellAccessoryCheckmarkНапример, есть ли какие-нибудь ссылки о том, как сделать что-то свое ? Спасибо.
Дэн Розенстарк
6
Чтобы увидеть это иногда нужно установить:cell.textLabel.backgroundColor = [UIColor clearColor];
Эван Моран
205

Вот наиболее эффективный способ решения этой проблемы - использовать метод делегата willDisplayCell (он также учитывает белый цвет фона текстовой метки при использовании cell.textLabel.text и / или cell.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]];

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

Натан Б.
источник
Это более чистое решение. Большинство других решений требуют подкласса UITableViewCell. Решение vlado.grigorov не работает для меня.
Ронни Лью
Действительно, и этот метод Apple рекомендует самим в соответствии с различными презентациями WWDC, которые я видел.
Майк Веллер
Хороший - за исключением случаев, когда вам нужно добавить новые строки в верхней части списка. Этот метод делает все дополнения одного цвета. Обновление это исправляет, но занимает ненужное время. Обнаружено вчера ...
JOM
Кажется, это работает хорошо, за исключением случаев использования Core Data. Новые ячейки, добавленные через NSFetchedResultsController, похоже, неправильно вызывают willDisplayCell. Я в недоумении, заставляя его работать ...
Радвен
Эквивалентная строка для установки цвета фона в Swift 2.0:cell.backgroundColor = UIColor.clearColor
kbpontius
104

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

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

Код:

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

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

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

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

Seba
источник
3
Это должно быть помечено как правильный ответ, так как вам даже ничего не нужно, если у вас есть раскрывающий показатель
Ашиш Авагад
1
Это не сработает, если вы хотите, чтобы цвет фона ячейки отличался от фона для таблиц.
Крис
Для групповой ячейки, вы можете установить его на cellForRow
Sharen Эйрз
58

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

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

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 ];
}
Владимир Григоров
источник
1
Если вы сделаете это, убедитесь, что для свойства opaque также установлено значение NO.
Лили Баллард
11
Использование прозрачных элементов управления ячейки действительно не рекомендуется. Производительность прокрутки будет сильно зависеть, поэтому Apple всегда говорит использовать непрозрачные элементы управления.
Майк Веллер
3
На iOS 4.2 и более поздних версиях похоже, что цикл больше не нужен.
Фрэнк Шмитт
Очень хорошо. Прекрасно работает при использовании дополнительных видов!
RyanG
19

Просто поместите это в свой файл класса делегата 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

Я согласен с Seba, я пытался установить свой чередующийся цвет строки в методе делегата 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;
    }

}
cipherz
источник
1
Все еще не понимаю, почему установка его в willDisplayCell имеет какое-либо значение. В любом случае это называется, правильно мы это реализуем или нет?
Sharen Eayrs
6

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

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (...){
        cell.backgroundColor = [UIColor blueColor];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
}
Джим Хуан
источник
4

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

Уильям Денисс
источник
Преимущество этого подхода заключается в том, что вы можете сохранить цвет в свойствах времени проектирования в Интерфейсном Разработчике. Еще одна проблема дизайна, требующая взаимодействия с разработчиком.
Whitneyland
1
cell.backgroundView = [[[UIView alloc] initWithFrame: cell.bounds] autorelease]; cell.backgroundView.backgroundColor = [UIColor redColor];
Брайан
3

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

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

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

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

Эндрю Грант
источник
1
Это определенно верно для ячеек в сгруппированных таблицах, но обычным таблицам не о чем беспокоиться. Ячейка без украшений без аксессуаров должна выглядеть хорошо.
Бен Готлиб
Бен - хорошая мысль. Я в основном использую сгруппированные таблицы, но, как вы упоминаете, простые таблицы не страдают от этих проблем.
Эндрю Грант
3

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

UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
            [lab setBackgroundColor:[UIColor grayColor]];
            cell.backgroundView = lab;
            [lab release];
Senthil
источник
3

Чтобы расширить ответ Н. Берендта - Если вы хотите установить цвет ячейки на основе какого-либо состояния в фактическом объекте данных ячейки, в то время как вы настраиваете остальную информацию для ячейки таблицы, которая обычно происходит, когда вы находитесь в Метод 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.

gamozzii
источник
3

Создайте изображение для использования в качестве фона в Photoshop или GIMP и назовите его myimage. Затем добавьте этот метод в ваш класс tableViewController:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    UIImage *cellImage = [UIImage imageNamed:@"myimage.png"];//myimage is a 20x50 px with  gradient  color created with gimp
    UIImageView *cellView = [[UIImageView alloc] initWithImage:cellImage];
    cellView.contentMode = UIContentViewModeScaleToFill;
    cell.backgroundView = cellView;
    //set the background label to clear
    cell.titleLabel.backgroundColor= [UIColor clearColor];
}

Это также будет работать, если вы установили UITableView в custom в инспекторе атрибутов.

Davide
источник
2

Мое решение состоит в том, чтобы добавить следующий код в событие cellForRowAtIndexPath:

UIView *solidColor = [cell viewWithTag:100];
if (!solidColor) {

    solidColor = [[UIView alloc] initWithFrame:cell.bounds];
    solidColor.tag = 100; //Big tag to access the view afterwards
    [cell addSubview:solidColor];
    [cell sendSubviewToBack:solidColor];
    [solidColor release];
}
solidColor.backgroundColor = [UIColor colorWithRed:254.0/255.0
                                             green:233.0/255.0
                                              blue:233.0/255.0
                                             alpha:1.0];

Работает при любых обстоятельствах, даже с кнопками раскрытия, и вашей логике лучше воздействовать на состояние цвета ячеек в cellForRowAtIndexPath, чем в событии cellWillShow, я думаю.

albertoFlagSolutions
источник
1

Подкласс UITableViewCell и добавьте это в реализацию:

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
}
JonahGabriel
источник
1
    UIView *bg = [[UIView alloc] initWithFrame:cell.frame];
    bg.backgroundColor = [UIColor colorWithRed:175.0/255.0 green:220.0/255.0 blue:186.0/255.0 alpha:1]; 
    cell.backgroundView = bg;
    [bg release];
Бхавеш Найи
источник
1

Это будет работать в последнем Xcode.

-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
    cell.backgroundColor = [UIColor grayColor];
}
Самера Р.
источник
0

Попробуй это:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
острая боль
источник