UITableViewHeaderFooterView: nie można zmienić koloru tła

124

Próbuję zmienić kolor tła UITableViewHeaderFooterView. Chociaż widok się pojawia, kolor tła pozostaje domyślnym kolorem. Otrzymuję dziennik z xcode mówiący:

Ustawienie koloru tła na UITableViewHeaderFooterView zostało wycofane. Zamiast tego użyj contentView.backgroundColor.

Jednak żadna z następujących opcji nie działa:

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

Próbowałem też zmienić kolor tła widoku w pliku xib.

Jakieś sugestie? Dzięki.

Chun
źródło
2
w iOS 13 działało dla mnie użycie contentView.backgroundColor. Myślę, że Apple zaktualizował to
Tà Truhoada

Odpowiedzi:

94

Należy użyć myTableViewHeaderFooterView.tintColor lub przypisać niestandardowy widok tła do myTableViewHeaderFooterView.backgroundView.

Matt
źródło
2
myTableViewHeaderFooterView.tintColor działa doskonale. Dziękuję za odpowiedź!
Chun,
15
Nie wiem dlaczego, ale dla mnie tintColornie działa na iOS7. Mogłem zmienić kolor tylko przez przypisanie niestandardowego widoku:myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
skywinder
7
TintColor nie jest kolorem tła !!
João Nunes
189

iOS 8, 9, 10, 11 ...

Jedynym sposobem na ustawienie dowolnego koloru (z dowolną alfa) jest użycie backgroundView:

Szybki

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

Odpowiedzi na komentarze

  • Żadna z tych innych opcji nie działa niezawodnie (pomimo poniższych komentarzy)

    // self.contentView.backgroundColor = [UIColor clearColor];
    // self.backgroundColor = [UIColor clearColor];
    // self.tintColor = [UIColor clearColor];
    
  • backgroundViewjest zmieniany automatycznie. (Nie ma potrzeby dodawania ograniczeń)

  • Kontroluj alfa za pomocą UIColor(white: 0.5, alpha: 0.5)lub backgroundView.alpha = 0.5.
    (oczywiście każdy kolor się nada)

  • Korzystając z XIB , utwórz widok roota UITableViewHeaderFooterViewi skojarz go backgroundViewprogramowo:

    Zarejestruj się z:

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

    Załaduj za pomocą:

    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
    }
    

Próbny

↻ animacja powtórki

► Znajdź to rozwiązanie na GitHub i dodatkowe informacje na temat Swift Recipes .

SwiftArchitect
źródło
5
contentView nie istnieje, dlatego. tintcolor służy do przyciemnienia widoku, a nie tła. a backgroundcolor jest przestarzała. Tak więc twoja droga jest sposobem, aby to zadziałało. Przy okazji ładna składnia kodu
João Nunes
@ JoãoNunes, z C # / Xamarin składnia jest jeszcze schludniejsza:view.BackgroundView = new UIView(view.Bounds) { BackgroundColor = UIColor.Clear };
crishoj
W Xcode 6.1.1 pojawia się ostrzeżenie konsoli wykonawczej:Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.
Albert Bori,
W przypadku Xcode6.2 beta5 nadal otrzymuję to samo ostrzeżenie. Moja metoda tworzenia UITableViewHeaderFooterView opiera się na ładowaniu xib, który jest podobny do przykładowego kodu Apple, TVAnimationsGestures. Jednak TVAnimationGestures z Xcode6.2b5 nie generuje żadnego komunikatu ostrzegawczego. Kod Apple w ogóle nie ma ciągu „tła”. Oczywiście uitableVuewHeaderFooterview.contentView nie ma wartości w TVAnimationsGestures. Nie rozumiem, dlaczego tak się stało.
kmugitani
7
Dla osób, które nadal otrzymują ostrzeżenie: upewnij się, że UITableViewHeaderFooterView nie ma ustawionego backgroundColor w IB.
Tuslareb
24

W iOS 7 contentView.backgroundColordziałało u mnie, tintColornie.

   headerView.contentView.backgroundColor = [UIColor blackColor];

Chociaż clearColornie zadziałało to dla mnie, rozwiązaniem, które znalazłem, jest ustawienie backgroundViewwłaściwości na przezroczysty obraz. Może komuś to pomoże:

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

headerView.backgroundView = [[UIImageView alloc] initWithImage:blank];
szarfa
źródło
Myślę, że jest to lepsze podejście niż odpowiedź @SwiftArchitect (chociaż zadziałało). Fakt, że nie musisz dodawać nowego UIView, czyni go znacznie lepszym. U mnie zadziałało idealnie.
Erick A. Montañez
14

Upewnij się, że ustawiłeś backgroundColor contentViewdla UITableViewHeaderFooterView:

self.contentView.backgroundColor = [UIColor whiteColor];

Wtedy zadziała.

Rudolf J.
źródło
Tylko iOS> = 10 !. Dla iOS <10 użyj: backgroundView? .BackgroundColor = UIColor.white
Peter Kreinz
12

W moim przypadku wypróbowałem wszystko, co podano powyżej, ale nadal otrzymywałem ostrzeżenie „Ustawienie koloru tła na UITableViewHeaderFooterView zostało wycofane. Zamiast tego użyj contentView.backgroundColor”. potem próbowałem tego: w pliku xib kolor tła dla widoku nagłówka został wybrany, aby wyczyścić kolor zamiast domyślnego, gdy zmieniłem go na domyślny, ostrzeżenie zniknęło. było to

Zmieniono na to

AmJa
źródło
7

Aby uzyskać wyraźny kolor, używam

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

Wydaje mi się w porządku.

Dzieciństwo Andy
źródło
1
Ustawienie backgroundView = UIView()i wtedy backgroundColor = .clearbyło jedynym działającym rozwiązaniem. Dziękuję Ci.
Vive
7

W przypadku jednolitych kolorów tła ustawienie contentView.backgroundColorpowinno wystarczyć:

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

W przypadku kolorów z przezroczystością, w tym .clearkolorów, to już nie działa:

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

Aby uzyskać pełny przezroczysty nagłówek sekcji, ustaw backgroundViewwłaściwość na pusty widok:

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

Uważaj jednak na możliwe skutki uboczne. O ile widok tabeli nie jest ustawiony na „Pogrupowane”, nagłówki sekcji będą przyciągane u góry podczas przewijania w dół. Jeśli nagłówki sekcji są przezroczyste, zawartość komórki będzie widoczna, co może nie wyglądać dobrze.

Tutaj nagłówki sekcji mają przezroczyste tło:

wprowadź opis obrazu tutaj

Aby temu zapobiec, lepiej ustawić tło nagłówka sekcji na jednolity kolor (lub gradient) pasujący do tła widoku tabeli lub kontrolera widoku.

Tutaj nagłówki sekcji mają całkowicie nieprzezroczyste tło gradientowe:

wprowadź opis obrazu tutaj

Eneko Alonso
źródło
Geniusz! Zdefiniowanie pustego UIView dla backgroundView całkowicie rozwiązało problem! Dzięki!
Luiz Dias
6

wprowadź opis obrazu tutajW konstruktorze interfejsu podnieś plik .xib, na górnym elemencie, w Inspektorze atrybutów ustaw domyślny kolor tła. Następnie przejdź do widoku zawartości i ustaw tam kolor tła (odniesienie do https://github.com/jiecao-fm/SwiftTheme/issues/24 ).

Hosny
źródło
4

Na iOS9 headerView.backgroundView.backgroundColor działało dla mnie:

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

Na systemów iOS 8 używałem headerView.contentView.backgroundColorbez problemów, ale teraz z iOS 9, byłem coraz dziwny problem, który wykonany kolor tła nie wypełniać całą przestrzeń komórki. Więc spróbowałem tylko headerView.backgroundColori otrzymałem ten sam błąd z OP.

Ustawienie koloru tła na UITableViewHeaderFooterView zostało wycofane. Zamiast tego użyj contentView.backgroundColor.

Więc teraz wszystko działa świetnie i bez ostrzeżeń, używając headerView.backgroundView.backgroundColor

Jan
źródło
4

jeśli utworzyłeś niestandardową podklasę UITableViewHeaderFooterViewwith xibfile, powinieneś przesłonić setBackgroundColor. Pozostaw to puste.

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

}

A to rozwiąże Twój problem.

Voloda2
źródło
To jest dla mnie poprawna odpowiedź. Chociaż nie ustawiam koloru tła w moim HeaderFooterView, ale komunikat ostrzegawczy pojawia się w dzienniku konsoli. Tak denerwujące!
stan liu
4

Jeśli dostosowujesz komórkę nagłówka sekcji za pomocą Storyboard / Nib , upewnij się, że kolor tła jest domyślny dla widoku „Nagłówek sekcji tabeli”.

A jeśli masz podklasę UITableViewHeaderFooterViewi używasz nib, to co musisz zrobić, to utworzyć IBOutletdla widoku zawartości i nazwać go np. containerView. Nie należy tego mylić z tym contentView, który jest rodzicem tego widoku kontenera.

W tej konfiguracji containerViewzamiast tego zmieniasz kolor tła .

samwize
źródło
1

Próbowałem z łańcuchem pojawienia sięWhenContainedIn i zadziałało dla mnie.

[[UIView appearanceWhenContainedIn:[UITableViewHeaderFooterView class], [UITableView class], nil] 
         setBackgroundColor: [UIColor.grayColor]];
tylyo
źródło
1

może dlatego, że backgroundView nie istnieje

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

to działa dla mnie.

andrew54068
źródło
1

iOS 12, Swift 5. Jeśli chcesz (lub próbujesz!) użyć proxy wyglądu, działa następujące rozwiązanie:

  1. Podklasa UITableViewHeaderFooterView i uwidacznij własne ustawienia proxy wyglądu.
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. Ustaw serwer proxy wyglądu na żądaną szczegółowość.
MySectionHeaderView.appearance().forceBackgroundColor = .red

lub

MySectionHeaderView.appearance(whenContainedInInstancesOf: [MyOtherClass.self]).forceBackgroundColor = .red
Eli Burke
źródło
1

Zapomnij o trudnościach.

Dodaj do swojego projektu UITableViewHeaderFooterView+BGUpdate.swiftz kodem poniżej:

extension UITableViewHeaderFooterView {

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

Użycie jest proste, zgodnie z oczekiwaniami:

headerView.backgroundColor = .red

Przykłady użycia :

1) U delegata tableView:viewForHeaderInSection::

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

lub

2) W klasie niestandardowego widoku nagłówka:

class MyHeaderView: UITableViewHeaderFooterView {

    override func awakeFromNib() {
        super.awakeFromNib()
        backgroundColor = .red // <- here
    }
}
eli7ah
źródło
Ok ... Twój sposób jest lepszy. :) Dzięki
Eli Burke
1
To rozwiązanie powoduje pętlę rekurencyjną w systemie iOS 12.
Koppacetic
0

Ustawienie BackgroundView z wyraźnym kolorem działa dobrze w przypadku widocznych nagłówków. Jeśli tabela jest przewijana, aby wyświetlić nagłówki na dole, to rozwiązanie nie powiedzie się.

PSMoja tabela składa się tylko z nagłówków bez komórek.

user3106871
źródło
0

Szybki:

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

Utwórz UIView i ustaw kolor tła, a następnie ustaw go na self.backgroundView.

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

źródło
0

Czuję się zmuszony podzielić się swoim doświadczeniem. Miałem ten fragment kodu, który działał dobrze z iOS 10 i iOS 11headerView?.contentView.backgroundColor = .lightGray

Potem nagle zdecydowałem się wdrożyć aplikację na iOS 9, ponieważ jest kilka urządzeń (iPad mini starszej generacji nie aktualizuje się do żadnego systemu operacyjnego poza 9) - jedyne rozwiązanie, które działało na wszystkich iOS 9, 10 i 11 polegało na zdefiniowaniu widoku bazowego dla nagłówka, który następnie zawiera wszystkie inne podglądy nagłówka, połączenie go z scenorysem i ustawienie backgroundColortego widoku bazowego.

Będziesz chciał uważać podczas okablowania gniazdka, aby go nie nazywać: backgroundViewponieważ w niektórych jest już nieruchomość o tej nazwie superclass. Zadzwoniłem do mniecontainingView

Również podczas okablowania sterowania gniazdem kliknij widok, Document Outlineaby upewnić się, że nie jest podłączony dofile owner

Ahmed Khedr
źródło
0
let bgView = UIView()
bgView.backgroundColor = UIColor.clear
backgroundView = bgView
backgroundColor = UIColor.clear
contentView.backgroundColor = UIColor.clear
Shohin
źródło
Chociaż może to stanowić odpowiedź na pytanie, zostało zgłoszone do sprawdzenia. Odpowiedzi bez wyjaśnienia są często uważane za niskiej jakości. W odpowiedzi podaj komentarz, dlaczego jest to prawidłowa odpowiedź.
Dan