UITableViewCell muestra fondo blanco y no se puede modificar en iOS7

186

He implementado una clase de celda de vista de tabla personalizada que hereda de UITableViewCell. La vista de tabla contiene una imagen de fondo, por lo que quiero que el fondo de la celda sea transparente. Se ve muy bien antes de iOS7.

Sin embargo, en iOS7, la celda siempre se muestra con un fondo blanco.


Incluso para Xcode7, 2015, hay un error en el guión gráfico : debe establecer el color de fondo de una celda en el código.

Kjuly
fuente
puede cambiar el color de fondo de la celda directamente accediendo a su color de fondo de propiedad. cell.backgroundColor = [UIColor clearColor];
ViruMax

Respuestas:

384

Como dijo Apple DOC ( Referencia de clase UITableViewCell ):

... En iOS 7, las celdas tienen un fondo blanco de forma predeterminada ; En versiones anteriores de iOS, las celdas heredan el color de fondo de la vista de tabla adjunta. Si desea cambiar el color de fondo de una celda, hágalo en tableView: willDisplayCell: forRowAtIndexPath: método de su delegado de vista de tabla.

Entonces, para mi caso, para mostrar celdas con fondo transparente, solo necesito implementar el método de delegado en el controlador de vista de tabla como se muestra a continuación:

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

Solo tenga en cuenta : como dijo @null, "... parece que hay un error en el generador de interfaces ..." , no estoy totalmente seguro de si tiene el error, pero parece que sí porque su comentario obtuvo varios votos. Entonces, puede haber algo mal si usa IB. :)

Kjuly
fuente
53
Desafortunadamente no es cierto, parece que hay un error en el generador de interfaces y no pude configurarlo en mi celda personalizada desde el guión gráfico.
Tarek Hallak
1
@ null, aha, parece que iOS 7 SDK todavía tiene muchos errores que deben corregirse. Ya conocí a algunos, pero para Storyboard, no tengo idea. :)
Kjuly
44
También puedes hacer esto en el tableView:cellForRowAtIndexPath:método.
bugloaf el
1
@KendallHelmstetterGelner seguro? Todavía no lo he notado, parece que todavía funciona para mí. :)
Kjuly
1
Como dice bugloaf arriba, hágalo en tableView: cellForRowAtIndexPath:
amergin
66

Lo investigué un poco y descubrí que el color de fondo de la celda lo establece el sistema Apariencia. Entonces, si todas las celdas de su aplicación tienen un fondo claro, la solución más fácil sería:

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

E incluso si tienen un fondo diferente, el color claro parece ser el más conveniente como el predeterminado.

Anton Filimonov
fuente
1
Tú, mi amigo, eres un monstruo. Subclasifico todos mis UITableViewCellcorreos electrónicos, por lo que no fue un problema para mí proporcionar una superclase con un inicializador para configurar el color de BG clearColor, pero ¿adivina qué? Eso no funcionó ... Quiero decir, ¿POR QUÉ, APPLE?
Mazyod
Esto funciona. Sin embargo, el color blanco aparece fuera de la vista. Fui con la mejor respuesta para obtener el mejor efecto (sin popping).
Carl Prehn
@Anton Filimonov He configurado la apariencia de la celda de la vista de tabla en mi Appdelegate ahora en una vista particular Controlador Quiero tener un color diferente para la celda, ¿cómo puedo abordar este escenario? Intenté establecer un color diferente en el método de delegado CellWillDisplay, pero sin efecto. ¿Podría por favor ayudarme en esto
Peer Mohamed Thabib
@PeerMohamedThabib, cuéntanos un poco más sobre el medio ambiente (iPad / iPhone, versión iOS) y proporciona un código. Y en realidad puede investigar la situación usted mismo: solo haga una subclase de UITableViewCell, redefina el método setBackgroundColor: (solo llame a la implementación de la superclase dentro) y ponga un punto de interrupción en este método y verá qué cambia el color de la celda después de configurarlo inside tableView: willDisplayCellAtIndexPath:
Anton Filimonov
1
Incluso si tiene celdas mixtas, algunas con fondo y otras sin (transparente). La forma más fácil es definir una clase personalizada y escribir el mismo código. De esta manera, todas las clases de UITableViewCell permanecerán en el valor predeterminado y las clases personalizadas tendrán un color claro. [[Apariencia CustomTableCell] setBackgroundColor: [UIColor clearColor]]; Esto no afectará a UITableViewCells por defecto y solo afectará a las celdas personalizadas.
Ansari
30

Escriba esto en su método cellForRowAtIndexPath antes de devolver la celda;

cell.backgroundColor = [UIColor clearColor];
sanjana
fuente
1
Esto me ayudó con un problema en iOS 8 en iPhone 5.
Almo
13

El color de fondo predeterminado de un UITableViewCellen iOS 7 es blanco.

Debe establecer la backgroundColorpropiedad en algún lugar de su código. Por ejemplo, configúrelo después de crear la celda.

cell.backgroundColor = [UIColor clearColor];
Yiming Tang
fuente
Lo intenté pero no me ha funcionado. ¿Estás seguro de que funciona?
Matrosov Alexander
Funciona para mí para una celda de vista de tabla personalizada en el método initWithCoder: aDecoder.
ftvs
13

De hecho, descubrí que el problema surgía de que el color de fondo de UITableView no estaba configurado para borrar. Si cambia el color de fondo de UITableViewCell para borrarlo y todavía ve que es blanco, asegúrese de que el color de fondo de UITableView esté en claro (o lo que desee).

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

En veloz

tableView.backgroundView = nil
tableView.backgroundColor = UIColor.clearColor()
Endama
fuente
Solo para tu información, también puedes configurar esto en IB. Solo asegúrese de cambiar el color de fondo dentro de la sección 'Ver', y no solo la sección 'Vista de tabla' que aparentemente no tiene ningún efecto notable.
AndyDunn
1
Esto también funcionó para mí, estaba buscando la versión rápida. Se agregó lo que funcionó para mí en el código :)
Mugunthan Balakrishnan
10

Este es definitivamente un error de iOS. En iOS 8, configurar el color de fondo Interface Builderfunciona bien para iPhone, pero en iPad siempre es así whiteColor. Para solucionarlo, en el cellForIndexPathmensaje de origen de datos, poner esto en:

cell.backgroundColor = cell.backgroundColor

Y funcionará. Esta es exactamente la razón por la que dije que es un error ya que el código en sí mismo es bastante tonto, pero funciona.

superarts.org
fuente
Sigue siendo el caso de Xcode7 / iOS9. Agregué el código explícito en tableView: willDisplayCell: forRowAtIndexPath como se sugirió anteriormente.
Andrew Duncan
En XCode 7.0.1, la aplicación universal de compilación mostró un fondo negro en el iPhone con iOS 7,8,9 pero un fondo blanco en el iPad con iOS 9.0.2 (y probablemente otros, pero no se puede verificar). El código anterior lo arregló.
ScottyB
Para la anulación estática de tableView willDisplayCell con cell.backgroundColor = UIColor.clearColor (). La reasignación de la configuración de color en IB no funcionó para mí.
Viktor Kucera
4

Puede ser que su UITableViewCell esté seleccionado de forma predeterminada. Puede confirmar esto utilizando el nuevo depurador visual de Xcode 6 (o averiguar exactamente qué vista está causando que aparezca este glóbulo blanco).

ingrese la descripción de la imagen aquí

Curiosamente, después de saber esto ... configurar el color de fondo de la celda seleccionada para borrar aún no funcionó ... investigar un poco más, resulta que solo tuve que modificar el estilo de selección cuando estoy creando esta celda 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
fuente
enlace roto para depurador visual
Suragch
3

Descubrí que ninguno de los anteriores funcionó desde XCode 5.1.1, iOS 7.1.

Si está utilizando Interface Builder con celdas prototipo, seleccione la celda prototipo, luego, desde el selector de atributos en la sección Ver, cambie el valor predeterminado del formulario Fondo a Borrar color:

ingrese la descripción de la imagen aquí

Esto parece que funciona bien. Ninguno de los cambios de código anteriores son necesarios, esta es una solución pura de IB.

Miguel
fuente
2

La respuesta aceptada no me solucionó el problema. Tuve que hacer esto:

  1. En el generador de interfaces, seleccione la vista de tabla. Luego, desde el inspector de atributos, desde la sección Ver , configure el Fondo como transparente (0% de opacidad).

ingrese la descripción de la imagen aquí

  1. Desde el método cellForRowAtIndexPath de la clase de fuente de datos de la tabla:

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
        reuseIdentifier:CellIdentifier];
    cell.backgroundColor = [UIColor clearColor]; //Make cell transparent
RajV
fuente
Bueno, usas Interface Builder ... como @null comentó debajo de mi respuesta, "... parece que hay un error en el generador de interfaz ..." , no estoy totalmente seguro de si tiene el error, pero parece ser así porque El comentario obtuvo varios votos. ;)
Kjuly
Algo en iOS7 definitivamente tiene errores cuando se trata de fondo de celda transparente. Espero que mi respuesta ayude a otros que enfrentan una situación similar a la mía.
RajV
Esta no es la forma correcta de crear celdas para su vista de tabla, especialmente si está utilizando Interface Builder / Storyboards. En el fragmento de código, está creando una nueva celda cada vez que se le pide una a su delegado, ¡esto no es reutilizar! Para obtener los beneficios de rendimiento de la reutilización celular, debe usar cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]. En versiones anteriores, solta el argumento indexPath y luego prueba nil, creando instancias initWithStyle:reuseIdentifiersegún su fragmento de código en el caso nil.
ikuramedia
ikuramedia: dejé el código de reutilización fuera de mi publicación. Por supuesto, reutilizo las células. Ese no es el punto de esta publicación.
RajV
2

Para mí establecer cell.backgroundColor = cell.contentView.backgroundColor; ya sea tableView:willDisplayCell:forRowAtIndexPath:o tableView:cell:forRowAtIndexPath:hizo el trabajo.

Esto se debe a que configuré el color de fondo de contentView en Interface Builder como lo deseo.

mllm
fuente
1

Al agregar objetos de IU a una celda, Xcode 5 / IOS 7 agrega una nueva "Vista de contenido" que será la vista general de todos los elementos en la celda. Para establecer el color de fondo de la celda, establezca el color de fondo de esta Vista de contenido. Las soluciones anteriores no funcionaron para mí, pero esta funcionó bien para mí.

DrBug
fuente
La vista de contenido está disponible en versiones anteriores de SDK, solo debe establecer un color de fondo para la vista de contenido que cubra la vista de fondo de la celda.
Kjuly
Bueno, no aparece automáticamente en el generador de interfaces anterior a xcode 5. ¿Cuál es exactamente su punto?
DrBug
Quiero decir, tu respuesta se debatió para otro problema, no mi pregunta. Solo desea establecer un color de fondo para su celda, ¿verdad? Por lo tanto, no importa que las celdas tengan un fondo blanco de forma predeterminada o no en iOS 7, siempre puede implementarlo configurando un color para la vista de contenido, ya que la vista de contenido se ubica sobre la vista de fondo de la celda. ¿Tener sentido? ;)
Kjuly
1

Solución Swift 1.2:

Simplemente agregue una definición explícita para el color de fondo de su celda de la siguiente manera:

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

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

    return cell
}
Dan Beaulieu
fuente
Lo siento. Es mi error. Funciona. Me perdí algunas otras configuraciones.
Sung Kim
1

Tuve un problema similar, tuve que

  1. Establecer azul como el selectionStyle y
  2. agregue esto al código para corregirlo

    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
fuente
0

También puede usar un código de color para hacer que su celda UITableView sea lucrativa.

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

Este es el código para aplicar el método del código de color:

-(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
fuente