UITableViewCell mostra fundo branco e não pode ser modificado no iOS7


186

Eu implementei uma classe de célula de exibição de tabela personalizada que herda UITableViewCell. A tableview contém uma imagem de plano de fundo, portanto, quero que o plano de fundo da célula seja transparente. Parece ótimo antes do iOS7.

No entanto, no iOS7, a célula é sempre mostrada com um fundo branco.


Mesmo para o Xcode7, 2015, há um bug no storyboard : você precisa definir a cor de fundo de uma célula no código.


you can change the background colour of cell directly by accessing its property background colour. cell.backgroundColor = [UIColor clearColor];
ViruMax

Respostas:


384

As Apple DOC said (UITableViewCell Class Reference):

... In iOS 7, cells have a white background by default; in earlier versions of iOS, cells inherit the background color of the enclosing table view. If you want to change the background color of a cell, do so in the tableView:willDisplayCell:forRowAtIndexPath: method of your table view delegate.

Portanto, para o meu caso, para mostrar células com fundo transparente, basta implementar o método delegado no controlador de exibição de tabela, como abaixo:

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

Nota : Como o @null disse: "... parece haver um bug no construtor de interfaces ..." , não tenho muita certeza se ele possui o bug, mas parece que o comentário dele recebeu vários votos. Portanto, pode haver algo errado se você usar o IB. :)


53
Infelizmente não é verdade, parece haver um bug no criador de interface e não pude configurá-lo para minha célula personalizada a partir do storyboard.
Tarek Hallak

1
@ nulo, aha, parece que o iOS 7 SDK ainda tem muitos bugs que precisam ser corrigidos. Eu já conheci alguns, mas para o Storyboard, não faço ideia. :)
Kjuly

4
Você também pode fazer isso no tableView:cellForRowAtIndexPath:método
Buglaf #

1
@KendallHelmstetterGelner certo? Ainda não notei, parece que ainda funciona para mim. :) #
28414 Kjuly

1
Como bugloaf diz acima - fazê-lo em tableView: cellForRowAtIndexPath:
Amergin

66

Eu investiguei um pouco e descobri que o backgroundColor da célula é definido pelo sistema de Aparência. Portanto, se todas as células em seu aplicativo tiverem um plano de fundo claro, a solução mais fácil seria:

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

E mesmo que tenham um plano de fundo diferente, a cor clara parece ser a mais conveniente como a padrão.


1
You my friend are a monster. I subclass all my UITableViewCells, so it wasn't an issue for me to provide a superclass with an initializer to set the BG color to clearColor, but guess what? That didn't work... I mean, WHY, APPLE?
Mazyod

This works. However, the white color pops out of view. Went with top response for best effect (no popping).
Carl Prehn

@Anton Filimonov I have set the table view cell appearance in my Appdelegate now in a particular viewController I want to have different color for cell how can I approach this Scenario? I have tried to set different color in CellWillDisplay delegate method but no effect. Could you please help me on this
Peer Mohamed Thabib

@PeerMohamedThabib please tell some more about the environment (iPad/iPhone, iOS version) and provide some code. And actually you can investigate the situation yourself - just make a subclass of UITableViewCell, redefine the setBackgroundColor: method (just call superclass' implementation inside) and put a breakpoint to this method and you'll see, what changes cell color after you set it inside tableView:willDisplayCellAtIndexPath:
Anton Filimonov

1
Mesmo se você tiver células mistas, algumas com fundo e outras sem (transparente). A maneira mais fácil é definir uma classe personalizada e escrever o mesmo código. Dessa forma, todas as classes UITableViewCell permanecerão no padrão e as classes personalizadas terão cores claras. [[Aparência CustomTableCell] setBackgroundColor: [UIColor clearColor]]; Isso não afetará o UITableViewCells padrão e apenas causará impacto nas células personalizadas.
Ansari

30

Escreva isso no método cellForRowAtIndexPath antes da célula de retorno;

cell.backgroundColor = [UIColor clearColor];

1
Isso me ajudou com um problema no iOS 8 no iPhone 5.
Almo

13

A cor de fundo padrão de um UITableViewCell no iOS 7 é branca.

Você precisa definir a backgroundColorpropriedade em algum lugar do seu código. Por exemplo, defina-o após a criação da célula.

cell.backgroundColor = [UIColor clearColor];

Eu tentei, mas não funcionou para mim. Tem certeza de que funciona?
Matrosov Alexander

Funciona para mim para uma célula de exibição de tabela personalizada no método initWithCoder: aDecoder.
ftvs

13

Na verdade, descobri que o problema surgiu da cor de fundo do UITableView que não estava sendo definida como clara. Se você alterar a cor de fundo do UITableViewCell para clara e continuar vendo branco, verifique se a cor de fundo do UITableView está definida como clara (ou o que você quiser).

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

Na Swift

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

Apenas para sua informação, você também pode definir isso no IB. Apenas certifique-se de alterar a cor do plano de fundo na seção "Visualização" e não apenas na seção "Visualização da tabela", que aparentemente não tem efeito perceptível.
AndyDunn 14/10

1
isso funcionou para mim também, eu estava procurando a versão rápida dele. Adicionado o que funcionou para mim no código :)
Mugunthan Balakrishnan

10

Este é definitivamente um bug do iOS. No iOS 8, definir a cor de fundo Interface Builderfunciona bem no iPhone, mas no iPad é sempre whiteColor. Para corrigi-lo, na cellForIndexPathmensagem da fonte de dados, coloque isso em:

cell.backgroundColor = cell.backgroundColor

E vai funcionar. É exatamente por isso que eu disse que é um bug, já que o código em si é bastante besteira * t, mas funciona.


Ainda é o caso do Xcode7 / iOS9. Eu adicionei o código explícito em tableView: willDisplayCell: forRowAtIndexPath conforme sugerido acima.
Andrew Duncan

No XCode 7.0.1, o aplicativo universal de compilação mostrava fundo preto no iPhone com iOS 7,8,9, mas fundo branco no iPad com iOS 9.0.2 (e provavelmente outros, mas não é possível verificar). O código acima o corrigiu.
ScottyB

Para a tabela estática da substituição, willDisplayCell com cell.backgroundColor = UIColor.clearColor (). Reatribuir a configuração de cores no IB não funcionou para mim.
Viktor Kucera

4

Pode ser que o seu UITableViewCell esteja selecionado por padrão. Você pode confirmar isso usando o novo depurador visual do Xcode 6s (ou descobrir exatamente qual visualização está causando a exibição dessa célula branca).

enter image description here

Curiosamente, depois de saber isso .. definir a cor de plano de fundo da célula selecionada para limpar ainda não funcionou .. fazendo mais algumas pesquisas, acontece que eu apenas tive que modificar o estilo de seleção ao criar esta célula personalizada:

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

ligação quebrada para depurador Visual
Suragch

3

Descobri que nenhuma das opções acima funcionava no XCode 5.1.1, iOS 7.1.

Se você estiver usando o Interface Builder com células de protótipo, selecione a célula de protótipo e, no seletor de atributos na seção Exibir, altere o padrão do formulário Segundo plano para Limpar cor:

enter image description here

Isso parece funcionar bem. Nenhuma das alterações de código acima também são necessárias - esta é uma solução IB pura.


2

A resposta aceita não resolveu o problema para mim. Eu tive que fazer isso:

  1. No construtor de interface, selecione a visualização da tabela. Em seguida, no inspetor de atributos, na seção Exibir , defina o Plano de fundo como transparente (0% de opacidade).

enter image description here

  1. No método cellForRowAtIndexPath da classe de fonte de dados da tabela:

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

Bem, você usa o Interface Builder .. como o @ null comentou abaixo da minha resposta: "... parece haver um bug no interface builder ..." , não tenho muita certeza se ele possui o bug, mas parece que causa isso o comentário recebeu vários votos positivos. ;)
Kjuly 29/10

Algo no iOS7 é definitivamente incorreto quando se trata de fundo transparente da célula. Espero que minha resposta ajude outras pessoas que estão enfrentando situações semelhantes às minhas.
RajV

Esta não é a maneira correta de criar células para a sua tableview, especialmente se você estiver usando o Interface Builder / Storyboards. No snippet de código, você está criando uma nova célula toda vez que seu delegado é solicitado, isso não é reutilização! Para obter os benefícios de desempenho da reutilização de células, você deve usar cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]. Nas versões anteriores, você descarta o argumento indexPath e, em seguida, testa o valor nulo, instanciando initWithStyle:reuseIdentifierconforme seu snippet de código no caso nulo.
Ikuramedia

ikuramedia: deixei o código de reutilização fora da minha postagem. Claro, eu reuso células. Esse não é o objetivo deste post.
RajV

2

Para mim definição cell.backgroundColor = cell.contentView.backgroundColor; seja em tableView:willDisplayCell:forRowAtIndexPath:outableView:cell:forRowAtIndexPath: fez o trabalho.

Isso ocorre porque eu defino a cor de fundo do contentView no Interface Builder, conforme desejado.


1

Ao adicionar objetos de interface do usuário a uma célula, o Xcode 5 / IOS 7 adiciona uma nova "Visualização de Conteúdo", que será a super visão de todos os elementos na célula. Para definir a cor de plano de fundo da célula, defina a cor de plano de fundo dessa exibição de conteúdo. As soluções acima não funcionaram para mim, mas esta funcionou bem para mim.


A exibição de conteúdo também está disponível nas versões anteriores do SDK; você apenas define uma cor de segundo plano para a exibição de conteúdo que cubra a exibição de segundo plano da célula.
21413 Kjuly

Bem, ele não aparece automaticamente no criador de interface anterior ao xcode 5. Qual é exatamente o seu ponto?
DrBug 12/10

Quero dizer, sua resposta foi discutida para outra questão, não a minha pergunta. Você só quer definir uma cor de fundo para o seu celular, certo? Portanto, independentemente das células terem um plano de fundo branco por padrão ou não no iOS 7, você sempre pode implementá-lo definindo uma cor para a visualização de conteúdo, pois a visualização de conteúdo fica sobre a visualização de segundo plano da célula. Faz sentido? ;)
Kjuly

1

Solução Swift 1.2:

Basta adicionar uma definição explícita para a cor de fundo da sua célula da seguinte forma:

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

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

    return cell
}

Desculpe. Isso é ruim. Funciona. Perdi algumas outras configurações.
Sung Kim

1

Teve um problema semelhante, teve que

  1. Defina azul como a seleçãoStyle e
  2. adicione isso ao código para corrigi-lo

    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

Você também pode usar o código de cores para tornar lucrativo o seu UITableView Cell.

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

Este é o código para aplicar o método do código de cores:

-(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];
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.