UITableViewCell показує білий фон і його неможливо змінити на iOS7


186

Я реалізував спеціальний клас комірок перегляду таблиці, який успадковується UITableViewCell. Перегляд таблиці містить фонове зображення, тому я хочу, щоб фон комірки був прозорим. Це чудово виглядає перед iOS7.

Однак в iOS7 комірка завжди відображається з білим тлом.


Навіть для Xcode7, 2015, є помилка в раскадровці : у коді потрібно встановити колір тла комірки.


ви можете змінити колір фону клітинки безпосередньо, відкривши її колір тла властивості. cell.backgroundColor = [UIColor clearColor];
ViruMax

Відповіді:


384

Як сказав Apple DOC ( довідник про клас UITableViewCell ):

... У iOS 7 клітини за замовчуванням мають біле тло ; у попередніх версіях iOS клітини успадковують колір тла подання таблиці, що додається. Якщо ви хочете змінити колір тла комірки, зробіть це у таблиціView: willDisplayCell: forRowAtIndexPath: метод вашого делегата перегляду таблиці.

Тож для мого випадку, щоб показати клітинки з прозорим фоном, просто потрібно застосувати метод делегата в контролері подання таблиці, як показано нижче:

- (void)tableView:(UITableView *)tableView
  willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath
{
  [cell setBackgroundColor:[UIColor clearColor]];
}

Лише зауважте : Як сказав @null, "... здається, що в програмі інтерфейсів є помилка ..." , я не зовсім впевнений, чи є у нього помилка, але, здається, тому його коментар отримав кілька голосів. Тож може статися щось не так, якщо ви використовуєте ІБ. :)


53
На жаль, це неправда, здається, що в програмі інтерфейсів виникла помилка, і я не зміг її встановити на свою власну клітинку з розкадрівки.
Тарек Галлак

1
@null, ага, здається, iOS 7 SDK все ще має багато помилок, які потрібно виправити. Я вже познайомився з деякими, але щодо пов’язаних із Storyboard я поняття не маю. :)
Kjuly

4
Ви також можете це зробити tableView:cellForRowAtIndexPath:методом.
bugloaf

1
@KendallHelmstetterGelner впевнений? Я цього ще не помічав, здається, все ще працює на мене. :)
Kjuly

1
Як сказано вище в bugloaf - зробіть це в tableView: cellForRowAtIndexPath:
amergin

66

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

[[UITableViewCell appearance] setBackgroundColor:[UIColor clearColor]];

І навіть якщо вони мають різний фон, чіткий колір здається найзручнішим, як стандартний.


1
Ти мій друг - чудовисько. Я підклас всі свої UITableViewCells, тому для мене не було проблеми в наданні суперкласу з ініціалізатором для встановлення кольору BG clearColor, але вгадайте, що? Це не спрацювало ... Я маю на увазі, ЧОМУ, ЯБЛИКА?
Мазюд

Це працює. Однак білий колір спливає з поля зору. Пішов з найкращою реакцією для найкращого ефекту (без вискоку).
Карл Прен

@Anton Filimonov Я встановив зовнішній вигляд комірки таблиці таблиці в своєму Appdelegate зараз у певному viewController. Я хочу мати інший колір для комірок, як я можу підійти до цього сценарію? Я намагався встановити інший колір у методі делегування CellWillDisplay, але ефекту немає. Чи можете ви мені допомогти з цим питанням
Peer Mohamed Thabib

@PeerMohamedThabib, будь ласка, розкажіть детальніше про навколишнє середовище (iPad / iPhone, версія iOS) та вкажіть код. Насправді ви можете самостійно дослідити ситуацію - просто створіть підклас UITableViewCell, заново визначте метод setBackgroundColor: (просто зателефонуйте у реалізацію суперкласу всередині) та поставте крапку цього методу, і ви побачите, що змінює колір комірки після встановлення її всередині tableView: willDisplayCellAtIndexPath:
Антон Філімонов,

1
Навіть якщо у вас змішані клітини, деякі з фоном, а деякі без (прозорі). Найпростіший спосіб - визначити спеціальний клас і написати той самий код. Таким чином, всі класи UITableViewCell залишаться за замовчуванням, а спеціальні класи матимуть чітке забарвлення. [[Поява CustomTableCell] setBackgroundColor: [UIColor clearColor]]; Це не вплине на дефект UITableViewCells і впливає лише на користувацькі комірки.
Ансарі

30

Запишіть це у свій метод CellForRowAtIndexPath перед осередком повернення;

cell.backgroundColor = [UIColor clearColor];

1
Це допомогло мені з проблемою в iOS 8 на iPhone 5.
Almo

13

За замовчуванням колір тла UITableViewCelliOS 7 - білий.

Ви повинні встановити backgroundColorвластивість десь у своєму коді. Наприклад, встановіть його після того, як ви знову створили клітинку.

cell.backgroundColor = [UIColor clearColor];

Я спробував, але це не спрацювало для мене. Ви впевнені, що це працює?
Матросов Олександр

Підходить для мене для користувацької комірки подання таблиці в методі initWithCoder: aDecoder.
ftvs

13

Я фактично виявив, що проблема виникла з того, що колір фону UITableView не встановлюється для очищення. Якщо ви змінили колір фону UITableViewCell на ясний, і ви виявите, що ви все ще бачите білий, переконайтеся, що колір фону UITableView встановлено на чітке (або все, що вам потрібно).

[self.tableView setBackgroundView:nil];
[self.tableView setBackgroundColor:[UIColor clearColor]];

У Свіфта

tableView.backgroundView = nil
tableView.backgroundColor = UIColor.clearColor()

Просто FYI ви також можете встановити це в IB. Просто переконайтеся, що ви змінюєте колір фону в розділі «Вид», а не лише в розділі «Перегляд таблиці», який, мабуть, не помітно впливає.
AndyDunn

1
це теж працювало для мене, я шукав швидку його версію. Додано те, що працювало на мене в коді :)
Mugunthan Balakrishnan

10

Це, безумовно, помилка iOS. В iOS 8 встановлення кольору фону Interface Builderдобре працює для iPhone, але в iPad це завжди whiteColor. Щоб виправити це, у cellForIndexPathповідомленні джерела даних, вводячи це:

cell.backgroundColor = cell.backgroundColor

І воно спрацює. Саме тому я сказав, що це помилка, оскільки сам код у значній мірі * t, але він працює.


І все-таки справа в Xcode7 / iOS9. Я додав явний код у tableView: willDisplayCell: forRowAtIndexPath, як було запропоновано вище.
Ендрю Дункан

У комбінації XCode 7.0.1 універсальний додаток показав чорний фон на iPhone під керуванням iOS 7,8,9, але білий фон на iPad під керуванням iOS 9.0.2 (і, мабуть, інші, але неможливо перевірити). Вищевказаний код зафіксував це.
ScottyB

Для статичної tableView заміщення будеDisplayCell з cell.backgroundColor = UIColor.clearColor (). Призначення налаштування кольорів у IB не працювало для мене.
Віктор Кучера

4

Можливо, ваш UITableViewCell обраний за замовчуванням. Ви можете підтвердити це за допомогою нового візуального відладчика Xcode 6s (або дізнатися, який саме вид викликає появу цієї білої клітини).

введіть тут опис зображення

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

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // do customization here
    }
    self.selectionStyle = UITableViewCellSelectionStyleNone;
    [self setBackgroundColor:[UIColor clearColor]];
    return self;
}

розірвана ланка для візуального налагодження
Сурагч

3

Я виявив, що жодне з перерахованих вище не працювало з XCode 5.1.1, iOS 7.1.

Якщо ви використовуєте програму Interface Builder з комітками-прототипами, виберіть комірку-прототип, а потім у селекторі атрибутів у розділі «Перегляд» виберіть параметр «Форма фону» за замовчуванням на «Очистити колір»:

введіть тут опис зображення

Це, здається, працює добре. Жодна з наведених вище змін коду також не потрібна - це чисте рішення IB.


2

Прийнята відповідь не усунула проблеми для мене. Мені довелося це зробити:

  1. У конструкторі інтерфейсів виберіть подання таблиці. Потім від інспектора атрибутів із розділу Перегляд встановіть Фон прозорим (0% непрозорість).

введіть тут опис зображення

  1. З методу таблиці джерела даних таблиці CellForRowAtIndexPath:

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
        reuseIdentifier:CellIdentifier];
    cell.backgroundColor = [UIColor clearColor]; //Make cell transparent

Ну, ви використовуєте Інтерфейс Builder .., як @null прокоментував нижче моєї відповіді: "... здається, що в програмі інтерфейсів є помилка ..." , я не зовсім впевнений, чи є в ньому помилка, але, здається, так це викликає коментар отримав кілька голосів. ;)
Кюлей

Щось в iOS7, безумовно, баггі, коли мова йде про прозорий фон клітин. Сподіваюся, моя відповідь допоможе іншим, хто стикається з подібною ситуацією, як я.
RajV

Це не правильний спосіб створити клітинки для перегляду таблиці, особливо якщо ви використовуєте Інтерфейс Builder / Стілбордів. У фрагменті коду ви створюєте нову клітинку щоразу, коли ваш делегат запитує про це, це не використовується повторно! Щоб отримати переваги від продуктивності повторного використання комірок, вам слід скористатися cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]. У попередніх версіях ви скидаєте аргумент indexPath, а потім перевіряєте на нуль, інстанціюючи initWithStyle:reuseIdentifierвідповідно до вашого фрагмента коду у випадку нуля.
ikuramedia

ikuramedia: Я залишив код повторного використання поза посадою. Звичайно, я повторно використовую клітини. Це не сенс цієї посади.
RajV

2

Для мене встановлення cell.backgroundColor = cell.contentView.backgroundColor; або в роботі, tableView:willDisplayCell:forRowAtIndexPath:або tableView:cell:forRowAtIndexPath:зробив цю роботу.

Це тому, що я встановив колір тла contentView у програмі Interface Builder за бажанням.


1

Додаючи об’єкти UI до комірки, Xcode 5 / IOS 7 додає новий "Перегляд вмісту", який буде наглядом всіх елементів у комірці. Щоб встановити колір фону комірки, встановіть колір тла цього перегляду вмісту. Рішення вище не працювало для мене, але це добре працювало для мене.


Перегляд вмісту доступний і в попередніх версіях SDK, ви просто встановите колір фону для перегляду вмісту, який охоплює вигляд фону клітинки.
Кюли

Ну, вона не автоматично з'являється в програмі інтерфейсів, попередній для xcode 5. Що конкретно маєш на увазі?
DrBug

Тобто, ваша відповідь обговорювалася на інше питання, а не на моє запитання. Ви просто хочете встановити колір фону для своєї комірки, правда? Таким чином, незалежно від того, що клітини мають білий фон за замовчуванням чи не в iOS 7, ви завжди можете його реалізувати, встановивши колір для перегляду вмісту, тому що подання вмісту лежить над фоновим видом комірки. Мати сенс? ;)
Кюли

1

Рішення Swift 1.2:

Просто додайте чітке визначення фонового кольору вашої клітини так:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    // Configure the cell...
    cell.backgroundColor = UIColor.clearColor()

    return cell
}

Вибачте. Це моє погано. Це працює. Я пропустив деякі інші налаштування.
Сон Кім

1

Мав подібну проблему, довелося

  1. Встановіть синій як вибірStyle та
  2. додайте це до коду, щоб виправити його

    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    
      var bgColorView: UIView = UIView()
      bgColorView.backgroundColor = UIColor(red: (76.0 / 255.0), green: (161.0 / 255.0), blue: (255.0 / 255.0), alpha: 1.0)
      bgColorView.layer.masksToBounds = true
      tableView.cellForRowAtIndexPath(indexPath)!.selectedBackgroundView = bgColorView
      return true
    }

0

Ви також можете використовувати кольоровий код для того, щоб зробити свою клітинку UITableView вигідною.

[cell setBackgroundColor:[self colorWithHexString:@"1fbbff"]];

Це код для застосування методу кольорового коду:

-(UIColor*)colorWithHexString:(NSString*)hex
{
    NSString *cString = [[hex stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];


    if ([cString length] < 6) return [UIColor grayColor];

    if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2];

    if ([cString length] != 6) return  [UIColor grayColor];

    NSRange range;
    range.location = 0;
    range.length = 2;
    NSString *rString = [cString substringWithRange:range];

    range.location = 2;
    NSString *gString = [cString substringWithRange:range];

    range.location = 4;
    NSString *bString = [cString substringWithRange:range];

    unsigned int r, g, b;
    [[NSScanner scannerWithString:rString] scanHexInt:&r];
    [[NSScanner scannerWithString:gString] scanHexInt:&g];
    [[NSScanner scannerWithString:bString] scanHexInt:&b];

    return [UIColor colorWithRed:((float) r / 255.0f)
                         green:((float) g / 255.0f)
                          blue:((float) b / 255.0f)
                         alpha:1.0f];
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.