Як налаштувати колір тла UITableViewCell?


188

Я хотів би налаштувати фон (а може бути і межу) усіх UITableViewCells в моєму UITableView. Поки що я не зміг настроїти цей матеріал, тому у мене є купа білих фонових комірок, які є типовими.

Чи є спосіб зробити це за допомогою iPhone SDK?

Відповіді:


193

Потрібно встановити ваш колірColor вмісту комірки для вашого кольору. Якщо ви використовуєте аксесуари (наприклад, стрілки для розкриття інформації тощо), вони відображатимуться як білі, тому вам може знадобитися скочувати власні версії таких.


108
наприклад, myCell.contentView.backgroundColor = [UIColor greenColor];
JoBu1324

1
Відповідь vlado.grigorov більш гнучка - див. відповідь Вільяма Денніса
JoBu1324

3
Будь-які посилання про те, як, наприклад, розгорнути свою власну UITableViewCellAccessoryCheckmark? Дякую.
Dan Rosenstark

6
Щоб побачити його іноді, потрібно встановити:cell.textLabel.backgroundColor = [UIColor clearColor];
Еван Моран

205

Ось найефективніший спосіб, з яким я зіткнувся, щоб вирішити цю проблему, скористайтеся методом делегата 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]];

Це рішення добре працювало в моїх обставинах ...


Це спосіб очищення способу. Більшість інших рішень потребують або підкласифікації UITableViewCell. рішення vlado.grigorov не працює для мене.
Ronnie Liew

Дійсно, і це метод, який рекомендують самі Apple, згідно з різними презентаціями WWDC, які я бачив.
Майк Веллер

Приємно - ОКРЕМИ, коли вам потрібно додати нові рядки вгорі списку. Цей спосіб робить усі доповнення однаковим кольором. Refresh все це виправляє, але вимагає зайвого часу. Дізнався вчора ...
JOM

Це, здається, працює добре, за винятком випадків використання основних даних. Нові клітинки, додані через NSFetchedResultsController, схоже, не викликають належну функціюDisplayCell. Я в збитку, змушуючи це працювати ...
radven

Еквівалентна лінія для встановлення кольору фону в Swift 2.0:cell.backgroundColor = UIColor.clearColor
kbpontius

104

Це дійсно просто, оскільки ОС 3.0 просто задає колір фону клітинки методом willDisplayCell. Ви не повинні встановлювати колір у клітинціForRowAtIndexPath.

Це працює як для простого, так і для згрупованого стилю:

Код:

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

PS: Тут витяг документації для willDisplayCell:

"Перегляд таблиці надсилає це повідомлення своєму делегові безпосередньо перед тим, як він використовує клітинку для малювання рядка, тим самим дозволяючи делегатові налаштовувати об'єкт комірки перед його відображенням. Цей метод дає можливість делегатові змінити властивості на основі стану, встановлені раніше подання таблиці, наприклад, виділення та колір тла. Після повернення делегата подання таблиці встановлює лише властивості альфа та кадру, а потім лише під час анімації рядків, коли вони ковзають усередину або назовні ".

Я знайшов цю інформацію в цій публікації від коліонеля . Дякую йому!


3
Це слід позначити як правильну відповідь, оскільки у вас навіть нічого немає, якщо у вас є розголошенняІндіатор
Ashish Awaghad

1
Це не спрацьовує, якщо ви бажаєте для мене іншого кольору фону клітинки для фону перегляду таблиці.
Кріс

Для групової комірки ви можете встановити її на cellForRow
Sharen Eayrs

58

Найкращий підхід, який я знайшов поки що, - це встановити фоновий вигляд комірки та чіткий фон підвидів осередків. Звичайно, це добре виглядає на столах лише з індексованим стилем, незалежно від того, з аксесуарами чи без них.

Ось зразок, де фон комірки жовтий:

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

1
Якщо ви це зробите, переконайтеся, що для властивості непрозорого також встановлено значення NO.
Лілі Баллард

11
Використання прозорих елементів керування дійсно не рекомендується. На продуктивність прокрутки буде сильно впливати, тому Apple завжди каже використовувати непрозорі елементи керування.
Майк Веллер

3
На iOS 4.2 та пізніших версіях схоже, що цикл більше не потрібен.
Френк Шмітт

Дуже хороша. Працює ідеально під час використання аксесуарів подання !!
RyanG

19

Просто помістіть це у файл файлу класу делегата 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;
}

7

Я погоджуюся з 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;
    }

}

1
Досі не розумію, чому його встановлення у willDisplayCell має будь-яку зміну. Все одно це називається, чи ми це реалізуємо чи ні?
Шарен Ейрс

6

Спробувавши всі різні рішення, наступний метод є найелегантнішим. Змініть колір у наступному методі делегата:

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

4

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


Перевагою такого підходу є те, що ви можете зберегти властивість кольору дизайну в дизайні інтерфейсу. Одна менша проблема дизайну, яка вимагає взаємодії розробника.
Уїтніленд

1
cell.backgroundView = [[[UIView alloc] initWithFrame: cell.bounds] автовипуск]; cell.backgroundView.backgroundColor = [UIColor redColor];
Брайан

3

Налаштування фону клітинки перегляду таблиці з часом стає і "все або нічого". Дуже важко змінити колір або зображення, використовувані для фону клітинки вмісту, таким чином, щоб це не виглядало дивним.

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

Якщо ви зміните колір клітинки вмісту, ви отримаєте білі шматочки, помітні в кутах. Якщо ви зміните колір усієї комірки, у вас з’явиться блок кольору, що охоплює ширину виду.

Ви можете однозначно налаштувати клітинку, але це не так просто, як вам здається спочатку.


1
Це, безумовно, справедливо для комірок у згрупованих таблицях, але прості таблиці не мають надто багато хвилюватися. Неприхована клітина без аксесуарів повинна виглядати чудово.
Бен Готліб

Бен - хороший момент. Я в основному використовую згруповані таблиці, але, як ви згадуєте, звичайні таблиці не страждають від жодної з цих проблем.
Ендрю Грант

3

Створіть подання та встановіть це як фоновий вигляд комірки

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

3

Щоб продовжити відповідь Н.Берендта - Якщо ви хочете встановити колір комірки залежно від певного стану у фактичному об'єкті даних комірок, у той час ви конфігуруєте іншу інформацію для комірки таблиці, яка, як правило, знаходиться у Метод cellForRowAtIndexPath, ви можете зробити це, замінивши метод willDisplayCell, щоб встановити колір фону клітинки з фонового кольору перегляду вмісту - це обходиться з проблемою фонів кнопки розкриття тощо. де ви робите всі інші налаштування клітинок.

Отже: Якщо ви додасте цей метод до делегата перегляду таблиці:

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

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


2

Моє рішення - додати наступний код до події 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.


1

Підклас UITableViewCell і додайте це у реалізацію:

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

1
    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

Це буде працювати в останньому Xcode.

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

0

Спробуйте це:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.