UITableViewHeaderFooterView: no se puede cambiar el color de fondo

124

Estoy tratando de cambiar el color de fondo de UITableViewHeaderFooterView. Aunque aparece la vista, el color de fondo sigue siendo el color predeterminado. Recibo un registro de xcode que dice:

La configuración del color de fondo en UITableViewHeaderFooterView ha quedado en desuso. Utilice contentView.backgroundColor en su 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 intenté cambiar el color de fondo de la vista en el archivo xib.

¿Alguna sugerencia? Gracias.

Chun
fuente
2
en iOS 13, use contentView.backgroundColor funcionó para mí. Creo que Apple actualizó esto
Tà Truhoada

Respuestas:

94

Debe usar myTableViewHeaderFooterView.tintColor o asignar una vista de fondo personalizada a myTableViewHeaderFooterView.backgroundView.

Mate
fuente
2
myTableViewHeaderFooterView.tintColor funciona perfectamente. ¡Gracias por la respuesta!
Chun
15
No sé por qué, pero para mí tintColorno funciona en iOS7. Solo podía cambiar el color asignando una vista personalizada:myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
skywinder
77
¡TintColor no es el color de fondo!
João Nunes el
189

iOS 8, 9, 10, 11 ...

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

Rápido

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 comentarios

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

    // self.contentView.backgroundColor = [UIColor clearColor];
    // self.backgroundColor = [UIColor clearColor];
    // self.tintColor = [UIColor clearColor];
  • El backgroundViewse redimensiona automáticamente. (No es necesario agregar 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 ayUITableViewHeaderFooterView asocie backgroundViewprogramáticamente:

    Registrar 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
    }

Manifestación

↻ reproducir animación

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

Arquitecto Swift
fuente
55
contentView no existe por eso. tintcolor es teñir la vista, no su fondo. y backgroundcolor está en desuso. Por lo tanto, su camino es la forma de hacerlo funcionar. Por cierto, sintaxis de código agradable
João Nunes
@ JoãoNunes, con C # / Xamarin, la sintaxis es aún mejor:view.BackgroundView = new UIView(view.Bounds) { BackgroundColor = UIColor.Clear };
crishoj
En Xcode 6.1.1, obtienes una advertencia de consola en tiempo de ejecución:Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.
Albert Bori
Con Xcode6.2 beta5, todavía recibí la misma advertencia. Mi método de creación de UITableViewHeaderFooterView se basa en cargar xib, que es similar al código de muestra de Apple, TVAnimationsGestures. Sin embargo, TVAnimationGestures con Xcode6.2b5 no genera ningún mensaje de advertencia. El código de Apple no tiene cadena de 'fondo' en absoluto. Por supuesto, uitableVuewHeaderFooterview.contentView es nulo en TVAnimationsGestures. No entiendo por qué sucede esto.
kmugitani
77
Para las personas que aún reciben la advertencia: asegúrese de que UITableViewHeaderFooterView no tenga un fondo de color establecido en IB.
Tuslareb
24

En iOS 7 contentView.backgroundColorfuncionó para mí, tintColorno lo hizo.

   headerView.contentView.backgroundColor = [UIColor blackColor];

Aunque clearColorno funcionó para mí, la solución que encontré es establecer la backgroundViewpropiedad en imagen transparente. Tal vez ayude a alguien:

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

headerView.backgroundView = [[UIImageView alloc] initWithImage:blank];
faja
fuente
Creo que este es un mejor enfoque que la respuesta de @SwiftArchitect (aunque funcionó). El hecho de que no tenga que agregar una nueva UIView lo hace mucho mejor. Funcionó perfectamente para mí.
Erick A. Montañez
14

Asegúrese de establecer el color de fondo del contentViewpara su UITableViewHeaderFooterView:

self.contentView.backgroundColor = [UIColor whiteColor];

Entonces funcionará.

Rudolf J
fuente
iOS> = 10 solamente! Para iOS <10 use: backgroundView? .BackgroundColor = UIColor.white
Peter Kreinz
12

Para mí, probé todo lo mencionado anteriormente, pero aún recibí la advertencia "Establecer el color de fondo en UITableViewHeaderFooterView ha quedado en desuso. Utilice en su lugar contentView.backgroundColor". luego intenté esto: dentro del archivo xib, se seleccionó el color de fondo para la vista de encabezado para borrar el color en lugar del predeterminado una vez que lo cambié a predeterminado, la advertencia desapareció. era esto

Cambiado a esto

AmJa
fuente
7

Para un color claro, yo uso

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

A mí me parece bien.

InfanciaAndy
fuente
1
Configuración backgroundView = UIView()y luego backgroundColor = .clearfue la única solución de trabajo. Gracias.
Vive
7

Para colores de fondo sólidos, la configuración contentView.backgroundColordeberí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, incluido el .clearcolor, 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 backgroundViewpropiedad 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, lo que podría no verse bien.

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

ingrese 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 la vista de tabla o el controlador de vista.

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

ingrese la descripción de la imagen aquí

Eneko Alonso
fuente
¡Genio! ¡Definir una UIView vacía para backgroundView resolvió totalmente el problema para mí! ¡Gracias!
Luiz Dias
6

ingrese la descripción de la imagen aquíEn el creador de interfaces, levante su .xib, en el elemento superior, en el inspector de atributos, configure el color de fondo como predeterminado. Luego vaya a la Vista de contenido y configure el color de fondo allí (consulte https://github.com/jiecao-fm/SwiftTheme/issues/24 ).

Hosny
fuente
4

En 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.backgroundColorsin problemas, pero ahora con iOS 9, recibía un problema extraño que hacía que el color de fondo no llenara todo el espacio de la celda. Así que lo intenté headerView.backgroundColory obtuve el mismo error del OP.

La configuración del color de fondo en UITableViewHeaderFooterView ha quedado en desuso. Utilice contentView.backgroundColor en su lugar.

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

ene
fuente
4

si creó una subclase personalizada de UITableViewHeaderFooterViewcon xibarchivo, debe anular setBackgroundColor. Mantenlo vacío.

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

}

Y esto resolverá tu problema.

Voloda2
fuente
Esta es la respuesta correcta para mí. Aunque no configuro ningún color de fondo en mi HeaderFooterView, pero el mensaje de advertencia sigue apareciendo en el registro de mi consola. ¡Muy molesto!
Stan Liu
4

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

Y si subclasifica UITableViewHeaderFooterViewy usa plumín, entonces lo que tiene que hacer es crear un IBOutletpara 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 su containerViewlugar.

samwize
fuente
1

Lo intenté con la cadena aparienciaWhenContainedIn, y funcionó para mí.

[[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class], [UITableView class], nil] 
         setBackgroundColor: [UIColor.grayColor]];
tylyo
fuente
1

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
}

que trabajo para mi

andrew54068
fuente
1

iOS 12, Swift 5. Si está dispuesto (o lo está intentando) a usar un proxy de apariencia, la siguiente solución funciona:

  1. Subclase UITableViewHeaderFooterView y exponga su propia configuración de proxy de apariencia.
final class MySectionHeaderView: UITableViewHeaderFooterView {
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    override init(reuseIdentifier: String?) {
        super.init(reuseIdentifier: reuseIdentifier)
    }

    @objc dynamic var forceBackgroundColor: UIColor? {
        get { return self.contentView.backgroundColor }
        set(color) {
            self.contentView.backgroundColor = color
            // if your color is not opaque, adjust backgroundView as well
            self.backgroundView?.backgroundColor = .clear
        }
    }
}
  1. Establezca el proxy de apariencia en la granularidad deseada.
MySectionHeaderView.appearance().forceBackgroundColor = .red

o

MySectionHeaderView.appearance(whenContainedInInstancesOf: [MyOtherClass.self]).forceBackgroundColor = .red
Eli Burke
fuente
1

Olvídate de las dificultades.

Agregue a su proyecto UITableViewHeaderFooterView+BGUpdate.swiftcon el código a continuación:

extension UITableViewHeaderFooterView {

    open override var backgroundColor: UIColor? {
        get {
            return self.backgroundColor
        }
        set {
            let bgView = UIView()
            bgView.backgroundColor = newValue
            backgroundView = bgView
        }
    }
}

El uso es simple como esperaba antes:

headerView.backgroundColor = .red

Ejemplos de uso :

1) En delegado tableView:viewForHeaderInSection::

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = tv.dequeueReusableHeaderFooterView(withIdentifier: "MyHeaderView")
    headerView.backgroundColor = .red // <- here
    return headerView
}

o

2) En su clase de vista de encabezado personalizada:

class MyHeaderView: UITableViewHeaderFooterView {

    override func awakeFromNib() {
        super.awakeFromNib()
        backgroundColor = .red // <- here
    }
}
eli7ah
fuente
Ok ... tu camino es mejor. :) Gracias
Eli Burke
1
Esta solución provoca un bucle recursivo en iOS 12.
Koppacetic
0

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

Mi tabla consta solo de encabezados sin ninguna celda.

usuario3106871
fuente
0

Rápido:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView {
    var headerView: TableViewHeader = super.tableView(tableView, viewForHeaderInSection: section) as! TableViewHeader
    headerView.backgroundView.backgroundColor = UIColor.redColor()
}
AG
fuente
0

Cree UIView y configure el color de fondo, luego configúrelo en self.backgroundView.

- (void)setupBackgroundColor:(UIColor *) color {
    UIView *bgView = [[UIView alloc] initWithFrame:self.bounds];
    bgView.backgroundColor = color;
    self.backgroundView = bgView;
}

fuente
0

Me siento obligado a compartir mi experiencia. Tenía este código que funcionaba bien con iOS 10 e iOS 11headerView?.contentView.backgroundColor = .lightGray

Entonces, de repente, decidí implementar la aplicación para iOS 9, ya que hay algunos dispositivos (iPad mini, algunas generaciones anteriores no se actualizan a ningún sistema operativo más allá de 9): la única solución que funcionó para todos los iOS 9, 10 y 11 fue definir una vista base para el encabezado que luego contenga todas las demás subvistas de encabezado, conectarlo desde el guión gráfico y establecer el backgroundColorde esa vista base.

Deberá tener en cuenta al cablear el tomacorriente para no llamarlo: backgroundViewya que en algunos ya hay una propiedad con ese nombre superclass. Llamé al míocontainingView

Además, al cablear el control de salida, haga clic en la vista Document Outlinepara asegurarse de que no esté conectado afile owner

Ahmed Khedr
fuente
0
let bgView = UIView()
bgView.backgroundColor = UIColor.clear
backgroundView = bgView
backgroundColor = UIColor.clear
contentView.backgroundColor = UIColor.clear
Shohin
fuente
Si bien esto puede responder la pregunta, se marcó para su revisión. Las respuestas sin explicación a menudo se consideran de baja calidad. Proporcione algunos comentarios en la respuesta sobre por qué esta es la respuesta correcta.
Dan