UITableViewCell показывает белый фон и не может быть изменен на iOS7


186

Я реализовал пользовательский класс ячеек табличного представления, который наследуется от UITableViewCell. Таблица содержит фоновое изображение, поэтому я хочу, чтобы фон ячейки был прозрачным. Выглядит отлично до iOS7.

Однако в iOS7 ячейка всегда отображается на белом фоне.


Даже для Xcode7, 2015, в раскадровке есть ошибка : вы должны установить цвет фона ячейки в коде.


Вы можете изменить цвет фона ячейки напрямую, выбрав ее цвет фона. cell.backgroundColor = [UIColor clearColor];
ViruMax

Ответы:


384

Как сказал Apple DOC ( ссылка на класс UITableViewCell ):

... В iOS 7 ячейки по умолчанию имеют белый фон ; в более ранних версиях iOS ячейки наследуют цвет фона представления таблицы. Если вы хотите изменить цвет фона ячейки, сделайте это в tableView: willDisplayCell: forRowAtIndexPath: метод вашего делегата табличного представления.

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

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

Просто обратите внимание : как сказал @null: «... в конструкторе интерфейсов есть ошибка ...» , я не совсем уверен, есть ли в нем ошибка, но кажется, потому что его комментарий набрал несколько голосов. Так что может быть что-то не так, если вы используете IB. :)


53
К сожалению, это не так, похоже, в конструкторе интерфейсов есть ошибка, и я не могу установить ее в свою ячейку из раскадровки.
Тарек Халлак

1
@null, ага, похоже, iOS 7 SDK все еще содержит множество ошибок, которые нужно исправить. Я уже встречался с некоторыми, но о раскадровке я понятия не имею. :)
Кюлы,

4
Вы также можете сделать это в tableView:cellForRowAtIndexPath:методе.
bugloaf

1
@KendallHelmstetterGelner уверен? Я еще не заметил, кажется, все еще работает для меня. :)
Kjuly

1
Как говорит выше bugloaf - сделайте это в tableView: cellForRowAtIndexPath:
amergin

66

Я немного исследовал это и обнаружил, что ячейка backgroundColor установлена ​​системой Appearance. Таким образом, если все ячейки в вашем приложении имеют четкий фон, самым простым решением будет:

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

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


1
Вы мой друг монстр. Я делю все свои подклассы UITableViewCell, поэтому для меня не было проблемой предоставить суперкласс с инициализатором для установки цвета 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;

cell.backgroundColor = [UIColor clearColor];

1
Это помогло мне с проблемой в iOS 8 на iPhone 5.
Almo

13

Цвет фона по умолчанию UITableViewCellв iOS 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()

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

1
это сработало и для меня, я искал быструю версию. В код добавлено то, что у меня сработало :)
Мугунтан Балакришнан

10

Это определенно ошибка iOS. В iOS 8 настройка цвета фона в Interface BuilderiPhone работает нормально, но в iPad это всегда whiteColor. Чтобы исправить это, в cellForIndexPathсообщении источника данных, поместив это в:

cell.backgroundColor = cell.backgroundColor

И это будет работать. Именно поэтому я сказал, что это ошибка, так как сам код в значительной степени фуфло, но он работает.


Все еще дело за Xcode7 / iOS9. Я добавил явный код в tableView: willDisplayCell: forRowAtIndexPath, как предложено выше.
Эндрю Дункан

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

Для статического переопределения tableView willDisplayCell с помощью 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;
}

неработающая ссылка для визуального отладчика
Suragch

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

Ну, вы используете Interface Builder ... как @null прокомментировал ниже мой ответ: «... кажется, есть ошибка в построителе интерфейса ...» , я не совсем уверен, есть ли он, но кажется, потому что это комментарий набрал несколько голосов. ;)
Кюли

Что-то в iOS7 определенно глючит, когда дело доходит до прозрачного фона ячейки. Я надеюсь, что мой ответ поможет другим, кто сталкивается с подобной ситуацией, как я
RajV

Это неправильный способ создания ячеек для таблицы, особенно если вы используете Interface Builder / Storyboards. В фрагменте кода вы создаете новую ячейку каждый раз, когда ваш делегат запрашивает ее, это не повторное использование! Чтобы получить преимущества производительности повторного использования ячеек, вы должны использовать cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]. В более ранних версиях вы отбрасывали аргумент indexPath, а затем проверяли на nil, создавая экземпляр с помощью initWithStyle:reuseIdentifierсвоего фрагмента кода в случае nil.
ikuramedia

ikuramedia: Я оставил код повторного использования в своем посте. Конечно, я повторно использую клетки. Это не точка этого поста.
RajV

2

Для меня настройка cell.backgroundColor = cell.contentView.backgroundColor; либо в tableView:willDisplayCell:forRowAtIndexPath:или tableView:cell:forRowAtIndexPath:сделал работу.

Это потому, что я установил цвет фона contentView в Интерфейсном Разработчике как желаемый.


1

При добавлении объектов пользовательского интерфейса в ячейку 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. Установите синий как selectionStyle и
  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.