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.


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.


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 .


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];

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.


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


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.


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


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


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


4

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

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

}

Dan ini akan menyelesaikan masalah Anda.


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.


1

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

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

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.


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

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

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.


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

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

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


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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.