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

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

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

Ответ 1

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

Ответ 2

Вот наиболее эффективный способ решения этой проблемы, использовать метод делегата 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]];

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

Ответ 3

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

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

код:

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

P.S: Здесь извлечение документации для willDisplayCell:

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

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

Ответ 4

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

Вот пример, когда фон ячейки задыхается желтым:

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

Ответ 5

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

Ответ 6

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

}

Ответ 7

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

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

Ответ 8

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

Ответ 9

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

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

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

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

Ответ 10

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

UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
            [lab setBackgroundColor:[UIColor grayColor]];
            cell.backgroundView = lab;
            [lab release];

Ответ 11

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

Ответ 12

Создайте изображение для использования в качестве фона в 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 в инспекторе атрибутов.

Ответ 13

Мое решение состоит в том, чтобы добавить следующий код в событие 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, я думаю.

Ответ 14

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

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
}

Ответ 15

    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];

Ответ 16

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

-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
    cell.backgroundColor = [UIColor grayColor];
}

Ответ 17

Попробуйте следующее:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}