Настройка цвета фона ячейки табличного представления на iPhone - PullRequest
35 голосов
/ 23 мая 2009

Я хочу добиться эффекта, когда у одной ячейки табличного представления будет синий фон, у следующей будет белый, у следующей снова будет синий, а затем белый и т. Д. Не могли бы вы дать мне знать Как мне это сделать?

Спасибо.

Ответы [ 12 ]

73 голосов
/ 15 февраля 2010

Добавьте этот метод к вашему делегату табличного представления:

#pragma mark UITableViewDelegate
- (void)tableView: (UITableView*)tableView 
  willDisplayCell: (UITableViewCell*)cell 
forRowAtIndexPath: (NSIndexPath*)indexPath
{
    cell.backgroundColor = indexPath.row % 2 
        ? [UIColor colorWithRed: 0.0 green: 0.0 blue: 1.0 alpha: 1.0] 
        : [UIColor whiteColor];
    cell.textLabel.backgroundColor = [UIColor clearColor];
    cell.detailTextLabel.backgroundColor = [UIColor clearColor];
}
43 голосов
/ 23 мая 2009

Вы должны установить цвет фона представления содержимого ячейки

cell.contentView.backgroundColor = [UIColor colorWithRed...]

Это установит фон всей ячейки.

Чтобы сделать это для альтернативных ячеек, используйте indexPath.row и % на 2.

9 голосов
/ 04 декабря 2011

Если вы хотите установить цвет ячейки на основе некоторого состояния в реальном объекте данных ячейки, то это другой подход:

Если вы добавите этот метод в свой делегат табличного представления:

- (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.

5 голосов
/ 15 июня 2011

пожалуйста, добавьте следующий код в cellForRowAtIndexPath

if (indexPath.row % 2 == 0){
    cell.backgroundColor =[UIColor blueColor];
} else {
    cell.backgroundColor =[UIColor whiteColor];
}

Я думаю, это поможет вам

4 голосов
/ 06 июня 2009

Метод cell.contentView.backgroundColor = [UIColor colorWithRed...] в ответе lostInTransit работает, если вы не используете встроенную метку UITableViewCell.

Я обнаружил, что если вы используете встроенную метку, например, установив cell.text, вы получите непрозрачный белый блок под меткой, и только два конца ячейки показывают желаемый цвет.

Я не нашел способа отредактировать встроенную метку, чтобы она была непрозрачной (вы можете получить к ней доступ через UILabel* cellLabel = [cell.contentView.subviews objectAtIndex:0]).

Я решил проблему, добавив свой собственный UILabel. Как это:

UILabel* cellLabel = [[[UILabel alloc] initWithFrame:cell.frame] autorelease];
cellLabel.text = @"Test with non-opaque label";
cellLabel.backgroundColor = [UIColor clearColor];
cellLabel.opaque = NO;

[cell.contentView addSubview:cellLabel];
cell.contentView.backgroundColor = [UIColor darkGrayColor];
3 голосов
/ 07 сентября 2012

Это сработало для меня .. В cellForRowAtIndexPath,

cell.textLabel.backgroundColor = [UIColor clear];
cell.detailTextLabel.backgroundColor = [UIColor clearColor];
cell.contentView.backgroundColor = [UIColor grayColor]; //whichever color u want
cell.backgroundColor = cell.contentView.backgroundColor;

Для ваших требований, как уже упоминалось ранее, на основе значения indexPath% 2 вы можете выполнить вышеуказанную функцию.

3 голосов
/ 23 мая 2012

// метод экономии времени:

// в ячейке для метода индекса:

static NSString* evenIdentifier = @"even";
static NSString* oddIdentifier = @"odd";

__weak identifier;
if(indexPath.row %2 ==0)
{
    identifier = evenIdentifier;
}else{
    identifier = oddIdentifier;
}

cell = dequeue..WithIdentifier: identifier;
if(cell == nil){
    cell = allocOrLoadNib...;
    cell.backgroundColor = (indexPath.row %2 ==0 ? evenColor : oddColor);
}

// изменить содержимое ячейки и затем вернуть его. Легкая работа.

// это набросок кода. Пожалуйста, не копируйте его напрямую.

3 голосов
/ 18 августа 2011

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

cell.textLabel.backgroundColor = [UIColor redColor];
cell.contentView.backgroundColor = [UIColor redColor];
2 голосов
/ 15 февраля 2010

Этот код является немного более чистым решением для случая, когда вы используете встроенную текстовую метку и не хотите, чтобы белый цвет фона текстовой метки скрывал цвет фона. Это также устраняет проблему нарушения закругленных углов сгруппированного стиля табличного представления (что происходит, когда вы используете cell.contentView.backgroundColor вместо cell.backgroundColor):

UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.backgroundColor = [UIColor redColor];
cell.textLabel.backgroundColor = [UIColor clearColor]; //transparent background
0 голосов
/ 09 мая 2018

Добавьте backgroundView в ячейку и установите цвет фона на ваш выбор.

let backgroundView = View() //  add background view via code or via storyboard
view.backgroundColor = UIColor.red // your color
cell.backgroundView = backgroundView
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...