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

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

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

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

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

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

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

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

Код:

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

PS: Здесь вы найдете документацию для willDisplayCell:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы продлить ответ на 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.

Создайте изображение для использования в качестве фона с помощью Photoshop или gimp и назовите его myimage. Затем добавьте этот метод в class 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 в пользовательский инспектор атрибутов.

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

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

 -(void)layoutSubviews { [super layoutSubviews]; self.backgroundColor = [UIColor blueColor]; } 
  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]; 

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

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

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

 - (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { [cell setBackgroundColor:[UIColor clearColor]]; tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]]; } 
  • Как отобразить несколько столбцов в UITableView?
  • Изменение поведения прокрутки по умолчанию в заголовке раздела UITableView
  • Проблема UITableView при использовании отдельного делегата / источника данных
  • Повторное использование ячейки TableView и нежелательные галочки - это убивает меня
  • Как узнать, когда UITableView сделал прокрутку вниз в iPhone
  • Несколько UITableViews на одном UIView
  • Как сделать дополнительный просмотр float в UICollectionView в виде заголовков секций в обычном стиле UITableView
  • Получить нажатие кнопки внутри UITableViewCell
  • Как запустить UITableView на последней ячейке?
  • Как resize таблицыHeaderView UITableView?
  • Как прокрутить UITableView в определенную позицию
  • Давайте будем гением компьютера.