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.

Kjuly
fonte
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. :)

Kjuly
fonte
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.

Anton Filimonov
fonte
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];
sanjana
fonte
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];
Yiming Tang
fonte
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()
Endama
fonte
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.

superarts.org
fonte
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;
}
abbood
fonte
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.

Mike
fonte
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
RajV
fonte
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.

mllm
fonte
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.

DrBug
fonte
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
}
Dan Beaulieu
fonte
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
    }
Nakul Sudhakar
fonte
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];
}
MahboobiOSDeveloper
fonte