UITableViewHeaderFooterView: Não foi possível alterar a cor do plano de fundo


124

Estou tentando alterar a cor de fundo do UITableViewHeaderFooterView. Embora a exibição esteja aparecendo, a cor do plano de fundo permanece a cor padrão. Estou recebendo um log do xcode dizendo:

A configuração da cor de plano de fundo no UITableViewHeaderFooterView foi preterida. Em vez disso, use contentView.backgroundColor.

No entanto, nenhuma das seguintes opções funciona:

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

Eu também tentei alterar a cor de fundo da exibição no arquivo xib.

Alguma sugestão? Obrigado.


2
no iOS 13, use contentView.backgroundColor funcionou para mim. Eu acho que a Apple atualizou isso
Tà Truhoada

Respostas:


94

Você deve usar myTableViewHeaderFooterView.tintColor ou atribuir uma exibição de plano de fundo personalizada a myTableViewHeaderFooterView.backgroundView.


2
myTableViewHeaderFooterView.tintColor funciona perfeitamente. Obrigado pela resposta!
Chun

15
Não sei por que, mas para mim tintColornão estou trabalhando no iOS7. Eu poderia mudar de cor somente por exibição personalizada de atribuição:myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
skywinder

7
TintColor não é cor de fundo !!
João Nunes

189

iOS 8, 9, 10, 11 ...

A única maneira de definir qualquer cor (com qualquer alfa) é 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;
    });

Respostas aos Comentários

  • Nenhuma dessas outras opções funciona de maneira confiável (apesar dos comentários abaixo)

    // self.contentView.backgroundColor = [UIColor clearColor];
    // self.backgroundColor = [UIColor clearColor];
    // self.tintColor = [UIColor clearColor];
  • o backgroundViewé redimensionado automaticamente. (Não há necessidade de adicionar restrições)

  • Alfa de controle com UIColor(white: 0.5, alpha: 0.5)ou backgroundView.alpha = 0.5.
    (claro, qualquer cor serve)

  • Ao usar o XIB , torne a visualização raiz aeUITableViewHeaderFooterView associe backgroundViewprogramaticamente:

    Registre-se com:

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

    Carregar com:

    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

Animation repetir animação

► Encontre esta solução no GitHub e detalhes adicionais sobre o Swift Recipes .


5
O contentView não existe, por isso. tintcolor é tingir a vista e não o fundo. e backgroundcolor está obsoleto. Assim, o seu caminho é o caminho para fazê-lo funcionar. Btw sintaxe de código agradável
João Nunes

@ JoãoNunes, com C # / Xamarin, a sintaxe é ainda mais pura:view.BackgroundView = new UIView(view.Bounds) { BackgroundColor = UIColor.Clear };
crishoj

No Xcode 6.1.1, você recebe um aviso do console em tempo de execução:Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.
Albert Bori

Com o Xcode6.2 beta5, ainda recebi o mesmo aviso. Meu método de criação de UITableViewHeaderFooterView é baseado no carregamento do xib, que é semelhante ao código de exemplo da Apple, TVAnimationsGestures. No entanto, TVAnimationGestures com Xcode6.2b5 não gera nenhuma mensagem de aviso. O código da Apple não possui uma string 'background'. É claro que o uitableVuewHeaderFooterview.contentView é nulo no TVAnimationsGestures. Não entendo por que isso acontece.
kmugitani 6/15

7
Para pessoas que ainda recebem o aviso: verifique se o UITableViewHeaderFooterView não tem um backgroundColor definido no IB.
Tuslareb 13/02/16

24

No iOS 7 contentView.backgroundColorfuncionou para mim, tintColornão.

   headerView.contentView.backgroundColor = [UIColor blackColor];

Embora clearColornão tenha funcionado para mim, a solução que encontrei é definir a backgroundViewpropriedade para uma imagem transparente. Talvez ajude alguém:

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

headerView.backgroundView = [[UIImageView alloc] initWithImage:blank];

Acho que essa é uma abordagem melhor do que a resposta do @SwiftArchitect (embora funcionou). O fato de você não precisar adicionar um novo UIView torna tudo muito melhor. Funcionou perfeitamente para mim.
Erick A. Montañez 11/11

14

Certifique-se de definir o backgroundColor do contentViewpara o seu UITableViewHeaderFooterView:

self.contentView.backgroundColor = [UIColor whiteColor];

Então vai funcionar.


iOS> = apenas 10 !. Para iOS <10 utilização:? BackgroundView .backgroundColor = UIColor.white
Peter Kreinz

12

Para mim, tentei tudo o que foi descrito acima, mas ainda recebia o aviso "A configuração da cor de plano de fundo no UITableViewHeaderFooterView foi preterida. Por favor, use contentView.backgroundColor." tentei o seguinte: no arquivo xib, a cor de plano de fundo para a visualização do cabeçalho foi selecionada para limpar a cor em vez do padrão. Depois que a mudei para o padrão, o aviso foi embora. foi isto

Alterado para este


7

Para uma cor clara, eu uso

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

Parece bom para mim.


1
Definir backgroundView = UIView()e depois backgroundColor = .clearfoi a única solução de trabalho. Obrigado.
Vive

7

Para cores sólidas de fundo, definir o contentView.backgroundColordeve ser suficiente:

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

Para cores com transparência, incluindo .clearcores, isso não funciona mais:

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

Para um cabeçalho de seção transparente completo, configure a backgroundViewpropriedade para uma visualização vazia:

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

No entanto, cuidado com os possíveis efeitos colaterais. A menos que a exibição da tabela esteja definida como "Agrupado", os cabeçalhos das seções serão ajustados na parte superior ao rolar para baixo. Se os cabeçalhos da seção forem transparentes, o conteúdo da célula será visualizado, o que pode não parecer ótimo.

Aqui, os cabeçalhos das seções têm um plano de fundo transparente:

insira a descrição da imagem aqui

Para evitar isso, é melhor definir o plano de fundo do cabeçalho da seção para uma cor sólida (ou gradiente) que corresponda ao plano de fundo da visualização da tabela ou do controlador de visualização.

Aqui, os cabeçalhos das seções têm um fundo gradiente totalmente opaco:

insira a descrição da imagem aqui


Gênio! Definir um UIView vazio para backgroundView resolveu totalmente o problema para mim! Obrigado!
Luiz Dias


4

No iOS9 headerView.backgroundView.backgroundColor funcionou para mim:

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

No iOS8, eu estava usando headerView.contentView.backgroundColorsem problemas, mas agora com o iOS 9, eu estava tendo um problema estranho que fazia a cor do plano de fundo não preencher todo o espaço da célula. Então, tentei apenas headerView.backgroundColore recebi o mesmo erro do OP.

A configuração da cor de plano de fundo no UITableViewHeaderFooterView foi preterida. Em vez disso, use contentView.backgroundColor.

Então agora tudo funciona muito bem e sem avisos usando headerView.backgroundView.backgroundColor


4

se você criou uma subclasse personalizada de UITableViewHeaderFooterViewwith xibfile, você deve substituir setBackgroundColor. Mantenha-o vazio.

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

}

E isso vai resolver o seu problema.


Esta é a resposta correta para mim. Embora eu não defina nenhuma cor de plano de fundo no HeaderFooterView, mas a mensagem de aviso será exibida no log do console. Tão irritante!
stan Liu

4

Se você estiver personalizando uma célula de cabeçalho de seção com Storyboard / Nib , verifique se a cor de fundo é o padrão para a visualização "Cabeçalho de seção de tabela".

E se você subclasse UITableViewHeaderFooterViewe usando a ponta, o que você precisa fazer é criar um IBOutletpara a exibição de conteúdo e nomeá-la, por exemplo. containerView. Isso não deve ser confundido com contentView, que é o pai dessa exibição de contêiner.

Com essa configuração, você altera a cor do plano de fundo containerView.


1

Eu tentei com a aparênciaWhenContainedIn chain, e funcionou para mim.

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

1

talvez porque o backgroundView não exista

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

isso funciona para mim.


1

iOS 12, Swift 5. Se você deseja (ou está tentando!) usar um proxy de aparência, a seguinte solução funciona:

  1. Subclasse UITableViewHeaderFooterView e exponha sua própria configuração de proxy de aparência.
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. Defina o proxy de aparência na granularidade desejada.
MySectionHeaderView.appearance().forceBackgroundColor = .red

ou

MySectionHeaderView.appearance(whenContainedInInstancesOf: [MyOtherClass.self]).forceBackgroundColor = .red

1

Esqueça as dificuldades.

Adicione ao seu projeto UITableViewHeaderFooterView+BGUpdate.swiftcom o código abaixo:

extension UITableViewHeaderFooterView {

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

O uso é simples como você esperava antes:

headerView.backgroundColor = .red

Exemplos de uso :

1) Nos delegados tableView:viewForHeaderInSection::

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

ou

2) Na sua classe de visualização de cabeçalho personalizada:

class MyHeaderView: UITableViewHeaderFooterView {

    override func awakeFromNib() {
        super.awakeFromNib()
        backgroundColor = .red // <- here
    }
}

Ok ... seu caminho é melhor. :) Obrigado
Eli Burke

1
Esta solução causa um loop recursivo no iOS 12.
Koppacetic

0

Definir o BackgroundView com cores claras funciona bem para cabeçalhos visíveis. Se a tabela for rolada para mostrar os cabeçalhos na parte inferior, esta solução falhará.

A tabela PSMy consiste apenas em cabeçalhos sem células.


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

0

Crie o UIView e defina a cor do plano de fundo e defina-o como self.backgroundView.

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

0

Sinto-me compelido a compartilhar minha experiência. Eu tinha esse pedaço de código que funcionava bem no iOS 10 e iOS 11headerView?.contentView.backgroundColor = .lightGray

De repente, decidi implantar o aplicativo para iOS 9, pois existem alguns dispositivos (iPad mini, uma geração mais antiga não atualiza para nenhum sistema operacional além de 9) - A única solução que funcionou para todos os iOS 9, 10 e 11 foi definir uma vista de base para o cabeçalho que contém todas as outras subvisões de cabeçalho, conectá-la a partir do storyboard e definir a backgroundColorvista de base.

Você deve estar atento ao conectar a tomada para não ligar: backgroundViewcomo já existe uma propriedade com esse nome em algunssuperclass . Eu chamei meucontainingView

Além disso, ao conectar o controle da tomada, clique na visualização Document Outlinepara garantir que ele não esteja conectadofile owner


0
let bgView = UIView()
bgView.backgroundColor = UIColor.clear
backgroundView = bgView
backgroundColor = UIColor.clear
contentView.backgroundColor = UIColor.clear

Embora isso possa responder à pergunta, foi sinalizado para revisão. Respostas sem explicação são frequentemente consideradas de baixa qualidade. Por favor, forneça alguns comentários na resposta sobre por que essa é a resposta correta.
Dan
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.