UITableViewHeaderFooterView: No se puede cambiar el color de fondo


Estoy tratando de cambiar el color de fondo de UITableViewHeaderFooterView. Aunque la vista está apareciendo, el color de fondo sigue siendo el color predeterminado. Estoy recibiendo un registro de xcode diciendo:

Establecer el color de fondo en UITableViewHeaderFooterView ha sido obsoleto. Por favor utilice contentView.backgroundColor lugar.

Sin embargo, ninguna de las siguientes opciones funciona:

myTableViewHeaderFooterView.contentView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundView.backgroundColor = [UIColor blackColor];
myTableViewHeaderFooterView.backgroundColor = [UIColor blackColor];

También he intentado cambiar el color de fondo de la vista en el xib file.

Alguna sugerencia? Gracias.

Author: Sahil Kapoor, 2013-03-25

17 answers

Debe usar myTableViewHeaderFooterView.tintColor, o asignar una vista de fondo personalizada a myTableViewHeaderFooterView.backgroundView (en inglés).

 69
Author: Matt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-24 22:43:39

IOS 8, 9, 10, 11...

La única manera de establecer cualquier color (con cualquier alfa) es usar backgroundView:

Swift

self.backgroundView = UIView(frame: self.bounds)
self.backgroundView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)

Obj-C

self.backgroundView = ({
    UIView * view = [[UIView alloc] initWithFrame:self.bounds];
    view.backgroundColor = [UIColor colorWithWhite: 0.5 alpha:0.5];
    view;
    });

Respuestas a los Comentarios

  • Ninguna de estas otras opciones funciona de manera fiable (a pesar de los comentarios a continuación)

    // self.contentView.backgroundColor = [UIColor clearColor];
    // self.backgroundColor = [UIColor clearColor];
    // self.tintColor = [UIColor clearColor];
    
  • El backgroundView se redimensiona automáticamente. (No es necesario añadir restricciones)

  • Control alfa con UIColor(white: 0.5, alpha: 0.5) o backgroundView.alpha = 0.5.
    (por supuesto, cualquier color servirá)

  • Cuando use XIB , haga que la vista raíz sea UITableViewHeaderFooterView y asocie la backgroundView mediante programación:

    Registrarse con:

    tableView.register(UINib(nibName: "View", bundle: nil),
                       forHeaderFooterViewReuseIdentifier: "header")
    

    Cargar con:

    override func tableView(_ tableView: UITableView,
                            viewForHeaderInSection section: Int) -> UIView? {
        if let header =
            tableView.dequeueReusableHeaderFooterView(withIdentifier: "header") {
            let backgroundView = UIView(frame: header.bounds)
            backgroundView.backgroundColor = UIColor(white: 0.5, alpha: 0.5)
            header.backgroundView = backgroundView
            return header
        }
        return nil
    }
    

Demo

↻ animación de repetición

► Encuentre esta solución en GitHub y detalles adicionales en Recetas Swift .

 152
Author: SwiftArchitect,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-12 03:58:58

En iOS 7 contentView.backgroundColor funcionó para mí, tintColor no lo hizo.

   headerView.contentView.backgroundColor = [UIColor blackColor];

Aunque clearColor no funcionó para mí, la solución que encontré es establecer la propiedad backgroundView a imagen transparente. Tal vez ayude a alguien:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(1, 1), NO, 0.0);
UIImage *blank = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

headerView.backgroundView = [[UIImageView alloc] initWithImage:blank];
 17
Author: sash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-30 14:38:31

Asegúrese de establecer el color de fondo de la contentView para su UITableViewHeaderFooterView:

self.contentView.backgroundColor = [UIColor whiteColor];

Entonces funcionará.

 9
Author: Rudolf J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-15 18:45:44

Para mí he intentado todo lo indicado anteriormente, pero todavía estaba recibiendo la advertencia "Establecer el color de fondo en UITableViewHeaderFooterView ha sido obsoleto. Por favor utilice contentView.backgroundColor lugar."entonces probé esto: dentro del archivo xib, el color de fondo para la vista de encabezado se seleccionó para borrar el color en lugar del predeterminado una vez que lo cambié a predeterminado, la advertencia desapareció. fue este

Cambiado a esto

 8
Author: AmJa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-19 17:12:57

On iOS9 headerView.backgroundView.backgroundColor funcionó para mí:

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
    TableViewHeader *headerView = (TableViewHeader *)[super tableView:tableView viewForHeaderInSection:section];
    headerView.backgroundView.backgroundColor = [UIColor redColor];
}

En iOS8 Estaba usando headerView.contentView.backgroundColor sin problemas, pero ahora con iOS 9, estaba teniendo un problema extraño que hacía que el color de fondo no llenara todo el espacio de la celda. Así que intenté solo headerView.backgroundColor y obtuve el mismo error de la OP.

Establecer el color de fondo en UITableViewHeaderFooterView ha sido obsoleto. Por favor utilice contentView.backgroundColor lugar.

Así que ahora todo funciona muy bien y sin advertencias usando headerView.backgroundView.backgroundColor

 4
Author: Jan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-06 16:41:20

Si ha creado una subclase personalizada de UITableViewHeaderFooterView con xib archivo, entonces debe anular setBackgroundColor. Mantenerlo vacío.

-(void)setBackgroundColor:(UIColor *)backgroundColor {

}

Y esto resolverá su problema.

 4
Author: Voloda2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-13 09:24:32

Para un color claro, utilizo

self.contentView.backgroundColor = [UIColor clearColor];
self.backgroundView = [UIView new];
self.backgroundView.backgroundColor = [UIColor clearColor];

Me parece bien.

 3
Author: ChildhoodAndy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-12 06:06:17

Si está personalizando una celda de encabezado de sección con Storyboard/Nib, asegúrese de que el color de fondo sea predeterminado para la vista "Encabezado de sección de tabla".

Y si subclases UITableViewHeaderFooterView, y usas nib, entonces lo que tienes que hacer es crear un IBOutlet para la vista de contenido, y nombrarlo por ejemplo. containerView. Esto no debe confundirse con contentView, que es el padre de esta vista de contenedor.

Con esa configuración, cambia el color de fondo de containerView en su lugar.

 3
Author: samwize,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-02 09:45:36

Para los colores de fondo sólido, establecer el contentView.backgroundColor debería ser suficiente:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.contentView.backgroundColor = .red // Works!
    }
}

Para colores con transparencia, incluyendo .clear color, esto ya no funciona:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.contentView.backgroundColor = .clear // Does not work 
    }
}

Para un encabezado de sección transparente completo, establezca la propiedad backgroundView en una vista vacía:

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    if let headerView = view as? UITableViewHeaderFooterView {
        headerView.backgroundView = UIView() // Works!
    }
}

Sin embargo, tenga cuidado con los posibles efectos secundarios. A menos que la vista de tabla esté configurada como "Agrupada", los encabezados de sección se ajustarán en la parte superior al desplazarse hacia abajo. Si los encabezados de sección son transparentes, se verá el contenido de la celda a través, que podría no verse muy bien.

Aquí, los encabezados de sección tienen un fondo transparente:

introduzca la descripción de la imagen aquí

Para evitar esto, es mejor establecer el fondo del encabezado de sección en un color sólido (o degradado) que coincida con el fondo de su vista de tabla o controlador de vista.

Aquí, los encabezados de sección tienen un fondo degradado completamente opaco:

introduzca la descripción de la imagen aquí

 2
Author: Eneko Alonso,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-06 18:55:08

Probé con la apariencia cuando estaba en cadena, y funcionó para mí.

[[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class], [UITableView class], nil] 
         setBackgroundColor: [UIColor.grayColor]];
 1
Author: tylyo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-15 09:54:22

introduzca la descripción de la imagen aquíEn interfaz builder tire hacia arriba su .xib, en el elemento superior, en el inspector de atributos establece el color de fondo por defecto. Luego vaya a la vista de contenido y establezca el color de fondo allí (referencia a https://github.com/jiecao-fm/SwiftTheme/issues/24).

 1
Author: Hosny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-25 15:22:36

Establecer backgroundView con color claro funciona bien para encabezados visibles. Si la tabla se desplaza para mostrar los encabezados en la parte inferior ,esta solución falla.

P.S.My la tabla consiste solo en encabezados sin celdas.

 0
Author: user3106871,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-09-22 06:41:59

Swift:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView {
    var headerView: TableViewHeader = super.tableView(tableView, viewForHeaderInSection: section) as! TableViewHeader
    headerView.backgroundView.backgroundColor = UIColor.redColor()
}
 0
Author: A.G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-11 09:10:53

Cree UIView y establezca el color de fondo, luego establézcalo en self.backgroundView (en inglés).

- (void)setupBackgroundColor:(UIColor *) color {
    UIView *bgView = [[UIView alloc] initWithFrame:self.bounds];
    bgView.backgroundColor = color;
    self.backgroundView = bgView;
}
 0
Author: Mike Kupriyanov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-07 10:11:31

Me siento obligado a compartir mi experiencia. Tenía esta pieza de código que funcionó bien con iOS 10 y iOS 11 headerView?.contentView.backgroundColor = .lightGray

Entonces, de repente, decidí implementar la aplicación para iOS 9, ya que hay algunos dispositivos (iPad mini alguna generación anterior no se actualiza a ningún sistema operativo más allá de 9): La única solución que funcionó para todos iOS 9, 10 y 11 fue definir una vista base para el encabezado que luego contiene todas las demás subviews de encabezado, cablearlo desde storyboard y establecer el backgroundColor de esa base vista.

Usted querrá tener cuidado al cablear la toma de no llamarlo: backgroundView ya que hay una propiedad con ese nombre en algunos superclass. Yo llamé a la mía containingView

También al cablear el control de salida, haga clic en la vista en Document Outline para asegurarse de que no esté cableado hasta file owner

 0
Author: Ahmed Khedr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-03 09:30:56

Tal vez porque el backgroundView no existe

override func draw(_ rect: CGRect){
    // Drawing code
    let view = UIView()
    view.frame = rect
    self.backgroundView = view
    self.backgroundView?.backgroundColor = UIColor.yourColorHere
}

Eso funciona para mí.

 0
Author: kidnapper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-17 09:25:25