it-swarm.com.ru

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

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

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

186
jpm

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

191
Ben Gottlieb

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

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

204
N.Berendt

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

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

Код:

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

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

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

Я нашел эту информацию в это сообщение от colionel . Поблагодарить его!

104
Seba

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

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

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 ];
}
57
Vladimir Grigorov

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

Я согласен с 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;
    }

}
7
cipherz

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

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

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

4
William Denniss

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

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

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

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

3
Andrew Grant

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

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

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

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

3
Davide

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

2
albertoFlagSolutions

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

-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
    cell.backgroundColor = [UIColor grayColor];
}
1
Sameera R.
    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
Bhavesh Nayi

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

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

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

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