UITableViewHeaderFooterView: Tidak dapat mengubah warna latar belakang

124

Saya mencoba mengubah warna latar belakang UITableViewHeaderFooterView. Meskipun tampilan muncul, warna latar belakang tetap menjadi warna default. Saya mendapatkan log dari xcode yang mengatakan:

Menyetel warna latar belakang pada UITableViewHeaderFooterView sudah tidak digunakan lagi. Gunakan contentView.backgroundColor sebagai gantinya.

Namun, tidak ada opsi berikut yang berfungsi:

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

Saya juga mencoba mengubah warna latar belakang tampilan di file xib.

Ada saran? Terima kasih.

Chun
sumber
2
di iOS 13, gunakan contentView.backgroundColor berfungsi untuk saya. Saya pikir Apple memperbarui ini
Tà Truhoada

Jawaban:

95

Anda harus menggunakan myTableViewHeaderFooterView.tintColor, atau menetapkan tampilan latar belakang kustom ke myTableViewHeaderFooterView.backgroundView.

Matt
sumber
2
myTableViewHeaderFooterView.tintColor bekerja dengan sempurna. Terima kasih atas jawabannya!
Chun
15
Tidak tahu kenapa, tapi bagi saya tintColortidak bekerja di iOS7. Saya dapat mengubah warna hanya dengan menetapkan tampilan kustom:myTableViewHeaderFooterView.backgroundView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
skywinder
7
TintColor bukanlah warna latar !!
João Nunes
189

iOS 8, 9, 10, 11 ...

Satu-satunya cara untuk menyetel warna apa pun (dengan alfa apa pun) adalah dengan menggunakan backgroundView:

Cepat

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

Tanggapan untuk Komentar

  • Tak satu pun dari opsi lain ini bekerja dengan andal (terlepas dari komentar di bawah)

    // self.contentView.backgroundColor = [UIColor clearColor];
    // self.backgroundColor = [UIColor clearColor];
    // self.tintColor = [UIColor clearColor];
  • yang backgroundViewdiubah ukurannya secara otomatis. (Tidak perlu menambahkan batasan)

  • Kontrol alfa dengan UIColor(white: 0.5, alpha: 0.5)atau backgroundView.alpha = 0.5.
    (tentu saja, warna apa pun bisa digunakan)

  • Saat menggunakan XIB , buat tampilan root a UITableViewHeaderFooterViewdan hubungkan secara backgroundViewterprogram:

    Daftar dengan:

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

    Muat dengan:

    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

↻ ulangi animasi

► Temukan solusi ini di GitHub dan detail tambahan di Swift Recipes .

SwiftArchitect
sumber
5
contentView tidak ada karena itu. tintcolor adalah untuk mewarnai tampilan, bukan latar belakangnya. dan backgroundcolor tidak digunakan lagi. Jadi cara Anda adalah cara membuatnya berhasil. Btw sintaks kode yang bagus
João Nunes
@ JoãoNunes, dengan C # / Xamarin sintaksnya bahkan lebih rapi:view.BackgroundView = new UIView(view.Bounds) { BackgroundColor = UIColor.Clear };
crishoj
Di Xcode 6.1.1, Anda mendapatkan peringatan konsol run-time:Setting the background color on UITableViewHeaderFooterView has been deprecated. Please use contentView.backgroundColor instead.
Albert Bori
Dengan Xcode6.2 beta5, saya masih mendapat peringatan yang sama. Metode pembuatan UITableViewHeaderFooterView saya didasarkan pada pemuatan xib yang mirip dengan kode sampel Apple, TVAnimationsGestures. Namun, TVAnimationGestures dengan Xcode6.2b5 tidak menghasilkan pesan peringatan apa pun. Kode Apple sama sekali tidak memiliki string 'background'. Tentu saja, uitableVuewHeaderFooterview.contentView nihil di TVAnimationsGestures. Saya tidak mengerti mengapa ini terjadi.
kmugitani
7
Untuk orang yang masih mendapatkan peringatan: pastikan UITableViewHeaderFooterView tidak memiliki backgroundColor yang disetel di IB.
Tuslareb
24

Di iOS 7 contentView.backgroundColorbekerja untuk saya, tintColortidak.

   headerView.contentView.backgroundColor = [UIColor blackColor];

Meskipun clearColortidak berhasil untuk saya, solusi yang saya temukan adalah menyetel backgroundViewproperti ke gambar transparan. Mungkin itu akan membantu seseorang:

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

headerView.backgroundView = [[UIImageView alloc] initWithImage:blank];
selempang
sumber
Saya pikir ini adalah pendekatan yang lebih baik daripada jawaban @SwiftArchitect (Meskipun berhasil). Fakta bahwa Anda tidak perlu menambahkan UIView baru membuatnya lebih baik. Bekerja dengan sempurna untuk saya.
Erick A. Montañez
14

Pastikan Anda menyetel backgroundColor contentViewuntuk UITableViewHeaderFooterView:

self.contentView.backgroundColor = [UIColor whiteColor];

Maka itu akan berhasil.

Rudolf J
sumber
iOS> = 10 saja !. Untuk iOS <10 gunakan: backgroundView? .BackgroundColor = UIColor.white
Peter Kreinz
12

Bagi saya, saya mencoba semua yang disebutkan di atas tetapi masih mendapatkan peringatan "Menyetel warna latar belakang pada UITableViewHeaderFooterView sudah tidak digunakan lagi. Harap gunakan contentView.backgroundColor sebagai gantinya." kemudian saya mencoba ini: di dalam file xib warna latar belakang untuk tampilan header dipilih untuk menghapus warna daripada default setelah saya mengubahnya ke default peringatan itu hilang. apakah ini

Berubah menjadi ini

AmJa
sumber
7

Untuk warna yang jelas, saya gunakan

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

Sepertinya baik-baik saja bagiku.

ChildhoodAndy
sumber
1
Pengaturan backgroundView = UIView()dan kemudian backgroundColor = .clearadalah satu-satunya solusi yang berfungsi. Terima kasih.
Vive
7

Untuk warna latar belakang yang solid, pengaturan contentView.backgroundColorseharusnya cukup:

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

Untuk warna dengan transparansi, termasuk .clearwarna, ini tidak lagi berfungsi:

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

Untuk header bagian transparan penuh, setel backgroundViewproperti ke tampilan kosong:

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

Namun, waspadai kemungkinan efek sampingnya. Kecuali jika tampilan tabel disetel ke "Dikelompokkan", header bagian akan dipasang di bagian atas saat di-scroll ke bawah. Jika header bagian transparan, konten sel akan terlihat, yang mungkin tidak terlihat bagus.

Di sini, header bagian memiliki latar belakang transparan:

masukkan deskripsi gambar di sini

Untuk mencegah hal ini, lebih baik menyetel latar belakang tajuk bagian ke warna solid (atau gradien) yang cocok dengan latar belakang tampilan tabel atau pengontrol tampilan Anda.

Di sini, header bagian memiliki latar belakang gradien yang sepenuhnya buram:

masukkan deskripsi gambar di sini

Eneko Alonso
sumber
Jenius! Mendefinisikan UIView kosong untuk backgroundView benar-benar memecahkan masalah bagi saya! Terima kasih!
Luiz Dias
6

masukkan deskripsi gambar di siniDalam pembuat antarmuka, tarik .xib Anda, di elemen teratas, di inspektur atribut setel warna latar belakang ke default. Lalu pergi ke Tampilan Konten dan atur warna latar belakang di sana (rujuk ke https://github.com/jiecao-fm/SwiftTheme/issues/24 ).

Hosny
sumber
4

Di iOS9 headerView.backgroundView.backgroundColor bekerja untuk saya:

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

Di iOS8 saya menggunakan headerView.contentView.backgroundColortanpa masalah, tetapi sekarang dengan iOS 9, saya mendapatkan masalah aneh yang membuat warna latar belakang tidak memenuhi seluruh ruang sel. Jadi saya coba saja headerView.backgroundColordan saya mendapat kesalahan yang sama dari OP.

Menyetel warna latar belakang pada UITableViewHeaderFooterView sudah tidak digunakan lagi. Gunakan contentView.backgroundColor sebagai gantinya.

Jadi sekarang semuanya bekerja dengan baik dan tanpa peringatan dengan menggunakan headerView.backgroundView.backgroundColor

Jan
sumber
4

jika Anda membuat subkelas khusus UITableViewHeaderFooterViewdengan xibfile maka Anda harus mengganti setBackgroundColor. Kosongkan.

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

}

Dan ini akan menyelesaikan masalah Anda.

Voloda2
sumber
Ini jawaban yang benar untuk saya. Meskipun saya tidak mengatur warna latar belakang apa pun di HeaderFooterView saya tetapi pesan peringatan terus keluar di log konsol saya. Sangat mengganggu!
stan liu
4

Jika Anda menyesuaikan sel header bagian dengan Storyboard / Nib , maka pastikan warna latar belakangnya adalah default untuk tampilan "Table Section Header".

Dan jika Anda membuat subkelas UITableViewHeaderFooterView, dan menggunakan nib, maka yang harus Anda lakukan adalah membuat a IBOutletuntuk tampilan konten, dan beri nama misalnya. containerView. Jangan bingung dengan inicontentView , yang merupakan induk dari tampilan penampung ini.

Dengan pengaturan itu, Anda mengubah warna latar belakang containerView.

samwize
sumber
1

Saya mencoba dengan rantai lookWhenContainedIn, dan itu berhasil untuk saya.

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

mungkin karena backgroundView tidak ada

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

itu berhasil untuk saya.

andrew54068
sumber
1

iOS 12, Swift 5. Jika Anda bersedia (atau mencoba!) untuk menggunakan proxy tampilan, solusi berikut ini berfungsi:

  1. Subclass UITableViewHeaderFooterView dan tampilkan setelan proxy tampilan Anda sendiri.
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. Setel proxy tampilan pada perincian yang Anda inginkan.
MySectionHeaderView.appearance().forceBackgroundColor = .red

atau

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

Lupakan kesulitan.

Tambahkan ke proyek Anda UITableViewHeaderFooterView+BGUpdate.swift dengan kode di bawah ini:

extension UITableViewHeaderFooterView {

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

Pemakaian sederhana seperti yang Anda harapkan sebelumnya:

headerView.backgroundColor = .red

Contoh penggunaan :

1) Di delegasi tableView:viewForHeaderInSection: :

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

atau

2) Di kelas tampilan tajuk khusus Anda:

class MyHeaderView: UITableViewHeaderFooterView {

    override func awakeFromNib() {
        super.awakeFromNib()
        backgroundColor = .red // <- here
    }
}
eli7ah
sumber
Ok ... caramu lebih baik. :) Terima kasih
Eli Burke
1
Solusi ini menyebabkan loop rekursif pada iOS 12.
Koppacetic
0

Menyetel BackgroundView dengan warna bening berfungsi dengan baik untuk header yang terlihat. Jika tabel di-scroll untuk menampilkan header di bagian bawah, solusi ini gagal.

Tabel PSMy hanya terdiri dari header tanpa sel apa pun.

pengguna3106871
sumber
0

Cepat:

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

Buat UIView dan setel warna background, lalu setel ke self.backgroundView.

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

sumber
0

Saya merasa terdorong untuk membagikan pengalaman saya. Saya memiliki kode ini yang berfungsi dengan baik dengan iOS 10 dan iOS 11headerView?.contentView.backgroundColor = .lightGray

Kemudian saya tiba-tiba memutuskan untuk menerapkan aplikasi untuk iOS 9 karena ada beberapa perangkat (iPad mini beberapa generasi yang lebih tua tidak memperbarui ke OS apa pun di luar 9) - Satu-satunya solusi yang berfungsi untuk semua iOS 9, 10 dan 11 adalah untuk menentukan tampilan dasar untuk header yang kemudian berisi semua subview header lainnya, menghubungkannya dari storyboard dan mengatur backgroundColortampilan dasar itu.

Anda akan ingin berhati-hati saat memasang kabel untuk tidak memanggilnya: backgroundViewkarena sudah ada properti dengan nama itu di beberapasuperclass . Aku menelepon milikkucontainingView

Juga saat memasang kabel kontrol outlet klik pada tampilan Document Outlineuntuk memastikan itu tidak terhubungfile owner

Ahmed Khedr
sumber
0
let bgView = UIView()
bgView.backgroundColor = UIColor.clear
backgroundView = bgView
backgroundColor = UIColor.clear
contentView.backgroundColor = UIColor.clear
Shohin
sumber
Meskipun ini mungkin menjawab pertanyaan, itu ditandai untuk ditinjau. Jawaban tanpa penjelasan sering dianggap berkualitas rendah. Mohon berikan beberapa komentar dalam jawaban mengapa ini adalah jawaban yang benar.
Dan