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.

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

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

SwiftArchitect
fonte
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];
faixa
fonte
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.

Rudolf J
fonte
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

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

ChildhoodAndy
fonte
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

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

insira a descrição da imagem aquiNo criador de interface, puxe seu .xib, no elemento superior, no inspetor de atributos, defina a cor do plano de fundo como padrão. Em seguida, vá para a exibição de conteúdo e defina a cor do plano de fundo (consulte https://github.com/jiecao-fm/SwiftTheme/issues/24 ).

Hosny
fonte
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

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

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

samwize
fonte
1

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

[[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class], [UITableView class], nil] 
         setBackgroundColor: [UIColor.grayColor]];
tylyo
fonte
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.

andrew54068
fonte
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
Eli Burke
fonte
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
    }
}
eli7ah
fonte
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.

user3106871
fonte
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
fonte
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;
}

fonte
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

Ahmed Khedr
fonte
0
let bgView = UIView()
bgView.backgroundColor = UIColor.clear
backgroundView = bgView
backgroundColor = UIColor.clear
contentView.backgroundColor = UIColor.clear
Shohin
fonte
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