Ответы:
Вам нужно установить backgroundColor для contentView ячейки в ваш цвет. Если вы используете аксессуары (такие как стрелки раскрытия и т. Д.), Они будут отображаться белым цветом, поэтому вам может потребоваться свернуть их версии.
UITableViewCellAccessoryCheckmark
Например, есть ли какие-нибудь ссылки о том, как сделать что-то свое ? Спасибо.
cell.textLabel.backgroundColor = [UIColor clearColor];
Вот наиболее эффективный способ решения этой проблемы - использовать метод делегата 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]];
Это решение хорошо сработало в моих обстоятельствах ...
cell.backgroundColor = UIColor.clearColor
Это действительно просто, поскольку OS 3.0 просто устанавливает цвет фона ячейки в методе willDisplayCell. Вы не должны устанавливать цвет в cellForRowAtIndexPath.
Это работает как для простого, так и для группового стиля:
Код:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
cell.backgroundColor = [UIColor redColor];
}
PS: Вот выдержка из документации для willDisplayCell:
«Табличное представление отправляет это сообщение своему делегату непосредственно перед тем, как оно использует ячейку для рисования строки, что позволяет делегату настраивать объект ячейки перед его отображением. Этот метод дает делегату возможность переопределить свойства на основе состояния, установленные ранее с помощью табличное представление, например выделение и цвет фона. После возвращения делегата табличное представление устанавливает только свойства альфа-канала и фрейма, а затем только при анимации строк по мере их скольжения внутрь или наружу. "
Я нашел эту информацию в этом посте от 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 ];
}
Просто поместите это в свой файл класса делегата 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»), что я и пытался сделать.
Настройка фона ячейки табличного представления в конечном итоге становится подходом «все или ничего». Очень трудно изменить цвет или изображение, используемые для фона ячейки содержимого, таким образом, что это не выглядит странным.
Причина в том, что ячейка фактически охватывает ширину вида. Закругленные углы являются лишь частью стиля рисования, и в этой области находится представление содержимого.
Если вы измените цвет ячейки с содержимым, вы получите белые углы, видимые по углам. Если вы измените цвет всей ячейки, у вас будет блок цвета, охватывающий ширину вида.
Вы можете определенно настроить ячейку, но это не так просто, как вы думаете на первый взгляд.
Чтобы расширить ответ Н. Берендта - Если вы хотите установить цвет ячейки на основе какого-либо состояния в фактическом объекте данных ячейки, в то время как вы настраиваете остальную информацию для ячейки таблицы, которая обычно происходит, когда вы находитесь в Метод 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 в инспекторе атрибутов.
Мое решение состоит в том, чтобы добавить следующий код в событие 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];
Попробуй это:
- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
[cell setBackgroundColor:[UIColor clearColor]];
tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}