it-roy-ru.com

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

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

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


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

186
Kjuly

Как сказал [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. :)

383
Kjuly

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

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

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

66
Anton Filimonov

Запишите это в свой метод cellForRowAtIndexPath перед возвращением cell;

cell.backgroundColor = [UIColor clearColor];
30
sanjana

На самом деле я обнаружил, что проблема возникла из-за того, что цвет фона UITableView не был установлен для очистки. Если вы измените цвет фона UITableViewCell на прозрачный, и вы обнаружите, что по-прежнему видите белый, убедитесь, что фоновый цвет UITableView установлен на "прозрачный" (или что вы хотите).

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

In Swift

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

Цвет фона по умолчанию для UITableViewCell в iOS 7 - белый.

Вы должны установить свойство backgroundColor где-нибудь в вашем коде. Например, установите его после того, как вы недавно создали ячейку.

cell.backgroundColor = [UIColor clearColor];
13
Yiming Tang

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

cell.backgroundColor = cell.backgroundColor

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

10
superarts.org

Возможно, ваш UITableViewCell выбран по умолчанию. Вы можете подтвердить это с помощью Xcode 6s new визуальный отладчик (или узнать, какой именно вид вызывает появление этой белой ячейки).

enter image description here

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

- (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;
}
4
abbood

Я обнаружил, что ничего из вышеперечисленного не работает с XCode 5.1.1, iOS 7.1.

Если вы используете Interface Builder с ячейками-прототипами, выберите ячейку-прототип, а затем в селекторе атрибутов в разделе "Вид" измените фоновую форму по умолчанию на "Очистить цвет":

enter image description here

Кажется, это работает нормально. Ни одно из указанных выше изменений кода не требуется, - это чисто решение IB.

3
Mike

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

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

2
mllm

Принятый ответ не решил проблему для меня. Я должен был сделать это:

  1. В конструкторе интерфейса выберите представление таблицы. Затем из инспектора атрибутов в разделе Просмотр установите Фон в прозрачный (непрозрачность 0%).

enter image description here

  1. Из метода класса источника данных таблицы cellForRowAtIndexPath:

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

Была похожая проблема, пришлось

  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
    }
    
1
Nakul Sudhakar

Решение Swift 1.2:

Просто добавьте явное определение цвета фона вашей ячейки следующим образом:

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

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

    return cell
}
1
Dan Beaulieu

При добавлении объектов пользовательского интерфейса в ячейку Xcode 5/IOS 7 добавляет новое "представление содержимого", которое будет супервизором всех элементов в ячейке. Чтобы установить цвет фона ячейки, установите цвет фона этого представления содержимого. Приведенные выше решения не сработали для меня, но это сработало для меня.

1
DrBug

Вы также можете использовать цветовой код, чтобы сделать вашу ячейку 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];
}
0
MahboobiOSDeveloper