Как настроить цвет фона UITableViewCell?
Я хотел бы настроить фон (и, возможно, границы тоже) всех UITableViewCells в моем UITableView. До сих пор я не смог настроить этот материал, поэтому у меня есть куча белых фоновых ячеек, которые по умолчанию.
есть ли способ сделать это с помощью iPhone SDK?
17 ответов:
вам нужно установить свойство backgroundColor на странице просмотр содержимого ячейки в свой цвет. Если вы используете аксессуары (например, стрелки раскрытия и т. д.), Они будут отображаться как белые, поэтому вам может потребоваться свернуть их пользовательские версии.
вот наиболее эффективный способ, с которым я столкнулся, чтобы решить эту проблему, используйте метод делегата willDisplayCell (это заботится о белом цвете для фона текстовой метки, а также при использовании ячейки.textLabel.текст и/или мобильный.detailTextLabel.текст):
- (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]; }P. S: вот выписка из документации для willDisplayCell:
"табличное представление отправляет сообщение его делегат непосредственно перед использованием ячейки нарисовать ряд, тем самым позволив делегировать для настройки объекта ячейки перед его отображением. Этот метод дает делегату возможность переопределение набора свойств на основе состояния ранее по табличному представлению, например выбор и цвет фона. После делегат возвращает табличное представление устанавливает только альфа и кадр свойства, и то только когда анимация строк по мере их скольжения или из."
Я нашел эту информацию в этот пост от колионель. Спасибо ему!
лучший подход, который я нашел до сих пор, - это установить фоновый вид ячейки и четкий фон подвидов ячеек. Конечно, это выглядит красиво на столах с индексированным стилем только, независимо от того, с аксессуарами или без них.
вот пример, где фон ячейки задыхается желтым:
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 ]; }
просто поместите это в файл класса делегата UITableView (.м):
- (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; }
Я согласен с себой, Я попытался установить свой чередующийся цвет строки в методе делегата 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]; } }
Владо.у Григорова есть хороший совет-лучший способ-создать фоновое изображение и дать ему цвет, установив все остальное на clearColor. Кроме того, я думаю, что это единственный способ правильно очистить цвет (попробуйте его образец, но установите "clearColor" вместо "yellowColor"), что я и пытался сделать.
настройки фона таблицы вид клеток, в конечном итоге, становится и "все или ничего". Очень сложно изменить цвет или изображение, используемое для фона ячейки содержимого, таким образом, чтобы это не выглядело странно.
причина в том, что ячейка фактически охватывает ширину представления. Закругленные углы являются лишь частью его стиля рисования, и вид содержимого находится в этой области.
Если вы измените цвет ячейки содержимого, вы получите белые кусочки видны по углам. Если вы измените цвет всей ячейки, у вас будет блок цвета, охватывающий ширину представления.
вы можете определенно настроить ячейку, но это не так просто, как вы можете подумать сначала.
создайте представление и установите его в качестве фонового представления ячейки
UIView *lab = [[UIView alloc] initWithFrame:cell.frame]; [lab setBackgroundColor:[UIColor grayColor]]; cell.backgroundView = lab; [lab release];
продлить на Н. Берендт ответ - Если вы хотите установить цвет ячейки, основываясь на некоторые государства, в фактической ячейке данных объекта, при настройке остальная информация в ячейке таблицы, как правило, когда вы находитесь в 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. Затем добавьте этот метод в класс 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 in attribute inspector.
мое решение-добавить следующий код в событие 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, я думаю.
подкласс 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"]]; }
Comments