UITableViewCell menampilkan latar belakang putih dan tidak dapat dimodifikasi di iOS7

186

Saya telah menerapkan kelas sel tampilan tabel kustom yang diwarisi dari UITableViewCell . Tableview berisi gambar latar belakang, jadi saya ingin latar belakang sel menjadi transparan. Ini terlihat hebat sebelum iOS7.

Namun, di iOS7, sel selalu ditampilkan dengan latar belakang putih.


Bahkan untuk Xcode7, 2015, ada bug di storyboard : Anda harus mengatur warna latar belakang sel dalam kode.

Kjuly
sumber
Anda dapat mengubah warna latar belakang sel secara langsung dengan mengakses warna latar belakang propertinya. cell.backgroundColor = [UIColor clearColor];
ViruMax

Jawaban:

384

Seperti yang dikatakan Apple DOC ( Referensi Kelas UITableViewCell ):

... Di iOS 7, sel memiliki latar belakang putih secara default ; di versi iOS sebelumnya, sel mewarisi warna latar belakang tampilan tabel terlampir. Jika Anda ingin mengubah warna latar belakang sel, lakukan di tableView: willDisplayCell: forRowAtIndexPath: metode delegasi tampilan tabel Anda.

Jadi untuk kasus saya bahwa untuk menunjukkan sel-sel dengan latar belakang transparan, hanya perlu menerapkan metode delegasi pada pengontrol tampilan tabel seperti di bawah ini:

- (void)tableView:(UITableView *)tableView
  willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath
{
  [cell setBackgroundColor:[UIColor clearColor]];
}

Catatan : Seperti yang dikatakan @null, "... sepertinya ada bug di pembuat antarmuka ..." , saya tidak sepenuhnya yakin apakah bug itu memang ada, tetapi sepertinya begitu karena komentarnya mendapat beberapa suara. Jadi mungkin ada yang salah jika Anda menggunakan IB. :)

Kjuly
sumber
53
Sayangnya tidak benar, sepertinya ada bug dalam pembangun antarmuka dan saya tidak bisa mengaturnya ke sel khusus saya dari storyboard.
Tarek Hallak
1
@null, aha, sepertinya iOS 7 SDK masih memiliki banyak bug yang perlu diperbaiki. Saya sudah bertemu beberapa, tapi untuk Storyboard terkait, saya tidak tahu. :)
Kjuly
4
Anda juga dapat melakukan ini dalam tableView:cellForRowAtIndexPath:metode ini.
bugloaf
1
@KendallHelmstetterGelner yakin? Saya belum menyadarinya, sepertinya masih berfungsi untuk saya. :)
Kjuly
1
Seperti yang dikatakan bugloaf di atas - lakukan di tableView: cellForRowAtIndexPath:
amergin
66

Saya menyelidiki sedikit dan menemukan bahwa backgroundColor sel diatur oleh sistem Appearance. Jadi, jika semua sel dalam aplikasi Anda memiliki latar belakang yang jelas, solusi termudah adalah:

[[UITableViewCell appearance] setBackgroundColor:[UIColor clearColor]];

Dan bahkan jika mereka memiliki latar belakang yang berbeda, warna jernih tampaknya paling nyaman sebagai standar.

Anton Filimonov
sumber
1
Anda teman saya adalah monster. Saya mensubklasifikasikan semua milik saya UITableViewCell, jadi saya tidak perlu menyediakan superclass dengan initializer untuk mengatur warna BG clearColor, tapi coba tebak? Itu tidak berhasil ... Maksudku, MENGAPA, APPLE?
Mazyod
Ini bekerja. Namun, warna putih muncul dari pandangan. Pergi dengan respons teratas untuk efek terbaik (tanpa popping).
Carl Prehn
@Anton Filimonov Saya telah mengatur tampilan sel tampilan tabel di Appdelegate saya sekarang di viewController tertentu. Saya ingin memiliki warna berbeda untuk sel, bagaimana saya bisa mendekati Skenario ini? Saya telah mencoba mengatur warna berbeda dalam metode delegasi CellWillDisplay tetapi tidak ada efek. Bisakah Anda membantu saya dalam hal ini
Peer Mohamed Thabib
@PeerMohamedThabib tolong beri tahu lebih banyak tentang lingkungan (iPad / iPhone, versi iOS) dan berikan beberapa kode. Dan sebenarnya Anda dapat menyelidiki sendiri situasinya - cukup buat subkelas dari UITableViewCell, tentukan kembali metode setBackgroundColor: (panggil implementasi superclass di dalamnya) dan letakkan breakpoint ke metode ini dan Anda akan melihat, apa yang mengubah warna sel setelah Anda mengaturnya inside tableView: willDisplayCellAtIndexPath:
Anton Filimonov
1
Bahkan jika Anda memiliki sel campuran, beberapa dengan latar belakang dan beberapa tanpa (transparan). Cara termudah adalah dengan mendefinisikan kelas khusus dan menulis kode yang sama. Dengan cara ini semua dari semua kelas UITableViewCell akan tetap pada standar dan kelas khusus akan memiliki warna yang jelas. [[Penampilan CustomTableCell] setBackgroundColor: [UIColor clearColor]]; Ini tidak akan memengaruhi UITableViewCells yang gagal, dan hanya memberi dampak pada sel khusus.
Ansari
30

Tulis ini dalam metode cellForRowAtIndexPath Anda sebelum mengembalikan sel;

cell.backgroundColor = [UIColor clearColor];
sanjana
sumber
1
Ini membantu saya dengan masalah di iOS 8 pada iPhone 5.
Almo
13

Warna latar belakang default suatu UITableViewCell di iOS 7 adalah putih.

Anda harus mengatur backgroundColorproperti di suatu tempat dalam kode Anda. Misalnya, atur setelah sel yang baru dibuat.

cell.backgroundColor = [UIColor clearColor];
Yiming Tang
sumber
Saya mencoba tetapi tidak berhasil untuk saya. Apakah Anda yakin itu berhasil?
Matrosov Alexander
Bekerja untuk saya untuk sel tampilan tabel kustom di initWithCoder: metode aDecoder.
ftvs
13

Saya benar-benar menemukan bahwa masalah muncul dari warna Latar Belakang UITableView yang tidak disetel untuk dihapus. Jika Anda mengubah warna Latar Belakang UITableViewCell menjadi jelas dan Anda menemukan Anda masih melihat putih, pastikan bahwa warna latar belakang UITableView diatur untuk dihapus (atau apa pun yang Anda inginkan).

[self.tableView setBackgroundView:nil];
[self.tableView setBackgroundColor:[UIColor clearColor]];

Dalam Swift

tableView.backgroundView = nil
tableView.backgroundColor = UIColor.clearColor()
Endama
sumber
Hanya FYI Anda juga dapat mengatur ini di IB. Pastikan Anda mengubah warna latar belakang di bagian 'Tampilan', dan bukan hanya bagian 'Tampilan Tabel' yang tampaknya tidak memiliki pengaruh yang nyata.
AndyDunn
1
ini bekerja untuk saya juga, saya sedang mencari versi cepatnya. Menambahkan apa yang bekerja untuk saya dalam kode :)
Mugunthan Balakrishnan
10

Ini jelas merupakan bug iOS. Di iOS 8, mengatur warna latar belakang Interface Builderberfungsi dengan baik untuk iPhone, tetapi di iPad selalu whiteColor. Untuk memperbaikinya, dalam cellForIndexPathpesan sumber data, masukkan ini ke:

cell.backgroundColor = cell.backgroundColor

Dan itu akan berhasil. Inilah tepatnya mengapa saya mengatakan itu bug karena kode itu sendiri cukup banyak omong kosong, tetapi berhasil.

superarts.org
sumber
Masih berlaku untuk Xcode7 / iOS9. Saya menambahkan kode eksplisit di tableView: willDisplayCell: forRowAtIndexPath seperti yang disarankan di atas.
Andrew Duncan
Dalam XCode 7.0.1 kompilasi aplikasi universal menunjukkan latar belakang hitam pada iPhone yang menjalankan iOS 7,8,9 tetapi latar belakang putih pada iPad yang menjalankan iOS 9.0.2 (dan mungkin yang lain tetapi tidak dapat memverifikasi). Kode di atas memperbaikinya.
ScottyB
Untuk tableView statis menimpa willDisplayCell dengan cell.backgroundColor = UIColor.clearColor (). Penugasan kembali pengaturan warna di IB tidak berhasil untuk saya.
Viktor Kucera
4

Bisa jadi UITableViewCell Anda dipilih secara default .. Anda dapat mengonfirmasi ini menggunakan debugger visual baru Xcode 6s (atau mencari tahu persis tampilan mana yang menyebabkan sel putih ini muncul).

masukkan deskripsi gambar di sini

Menariknya, setelah mengetahui hal ini .. mengatur warna latar belakang sel yang dipilih untuk menghapus masih tidak berfungsi .. melakukan penelitian lebih lanjut, ternyata saya hanya perlu memodifikasi gaya pemilihan ketika saya membuat sel khusus ini:

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        // do customization here
    }
    self.selectionStyle = UITableViewCellSelectionStyleNone;
    [self setBackgroundColor:[UIColor clearColor]];
    return self;
}
abbood
sumber
broken link untuk visual debugger
Suragch
3

Saya menemukan bahwa tidak ada yang di atas bekerja dari XCode 5.1.1, iOS 7.1.

Jika Anda menggunakan Pembuat Antarmuka dengan sel prototipe, pilih sel prototipe, lalu dari pemilih atribut di bagian Tampilan, ubah bentuk latar belakang default menjadi Clear Color:

masukkan deskripsi gambar di sini

Ini sepertinya bekerja dengan baik. Tidak ada perubahan kode di atas yang diperlukan, baik - ini adalah solusi IB murni.

Mike
sumber
2

Jawaban yang diterima tidak memperbaiki masalah bagi saya. Saya harus melakukan ini:

  1. Di pembangun antarmuka, pilih tampilan tabel. Kemudian dari inspektur atribut, dari bagian Tampilan , atur Background menjadi transparan (0% opacity).

masukkan deskripsi gambar di sini

  1. Dari metode class source data tabel cellForRowAtIndexPath:

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
        reuseIdentifier:CellIdentifier];
    cell.backgroundColor = [UIColor clearColor]; //Make cell transparent
RajV
sumber
Nah, Anda menggunakan Interface Builder .. seperti @null berkomentar di bawah jawaban saya, "... sepertinya ada bug di interface builder ..." , saya tidak sepenuhnya yakin apakah itu memang memiliki bug, tetapi sepertinya begitu karena itu komentar mendapat beberapa suara. ;)
Kjuly
Sesuatu di iOS7 jelas buggy ketika datang ke latar belakang sel transparan. Saya harap jawaban saya akan membantu orang lain yang menghadapi situasi yang sama dengan saya.
RajV
Ini bukan cara yang tepat untuk membuat sel untuk tampilan tabel Anda, terutama jika Anda menggunakan Interface Builder / Storyboards. Dalam cuplikan kode Anda membuat sel baru setiap kali delegasi Anda meminta satu, ini bukan digunakan kembali! Untuk mendapatkan manfaat kinerja penggunaan kembali sel yang harus Anda gunakan cell = [tableView dequeueReusableCellWithIdentifier:<#Reuse ID#> forIndexPath:indexPath]. Dalam versi sebelumnya Anda menjatuhkan argumen indexPath dan kemudian menguji nil, instantiating initWithStyle:reuseIdentifiersesuai dengan potongan kode Anda dalam case nil.
ikuramedia
ikuramedia: Saya meninggalkan kode penggunaan kembali dari posting saya. Tentu saja, saya menggunakan kembali sel. Itu bukan poin dari postingan ini.
RajV
2

Bagi saya pengaturan cell.backgroundColor = cell.contentView.backgroundColor; dalam tableView:willDisplayCell:forRowAtIndexPath:atau tableView:cell:forRowAtIndexPath:melakukan pekerjaan.

Ini karena saya mengatur warna latar belakang contentView di Interface Builder seperti yang diinginkan.

mllm
sumber
1

Saat menambahkan objek UI ke sel, Xcode 5 / IOS 7 menambahkan "Content View" baru yang akan menjadi superview semua elemen di dalam sel. Untuk mengatur warna latar belakang sel, atur warna latar belakang dari Tampilan Konten ini. Solusi di atas tidak bekerja untuk saya tetapi yang ini bekerja dengan baik untuk saya.

DrBug
sumber
Tampilan konten tersedia dalam versi SDK sebelumnya, Anda hanya mengatur warna latar belakang untuk tampilan konten yang mencakup tampilan latar belakang sel.
Kjuly
Yah, itu tidak muncul secara otomatis di pembangun antarmuka sebelum xcode 5. Apa sebenarnya maksud Anda?
DrBug
Maksud saya, jawaban Anda dibahas untuk masalah lain, bukan pertanyaan saya. Anda hanya ingin mengatur warna latar belakang untuk sel Anda, bukan? Jadi, tidak peduli sel memiliki latar belakang putih secara default atau tidak di iOS 7, Anda selalu dapat menerapkannya dengan mengatur warna untuk tampilan konten, karena tampilan konten terletak di atas tampilan latar belakang sel. Masuk akal? ;)
Kjuly
1

Solusi Swift 1.2:

Cukup tambahkan definisi eksplisit untuk warna latar belakang sel Anda seperti:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    // Configure the cell...
    cell.backgroundColor = UIColor.clearColor()

    return cell
}
Dan Beaulieu
sumber
Maaf. Ini salahku. Berhasil. Saya melewatkan beberapa pengaturan lainnya.
Sung Kim
1

Punya masalah yang sama, harus

  1. Setel biru sebagai selectionStyle dan
  2. tambahkan ini ke kode untuk memperbaikinya

    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
    
      var bgColorView: UIView = UIView()
      bgColorView.backgroundColor = UIColor(red: (76.0 / 255.0), green: (161.0 / 255.0), blue: (255.0 / 255.0), alpha: 1.0)
      bgColorView.layer.masksToBounds = true
      tableView.cellForRowAtIndexPath(indexPath)!.selectedBackgroundView = bgColorView
      return true
    }
Nakul Sudhakar
sumber
0

Anda juga dapat menggunakan kode warna untuk membuat UITableView Cell Anda menguntungkan.

[cell setBackgroundColor:[self colorWithHexString:@"1fbbff"]];

Ini adalah kode untuk menerapkan metode kode warna:

-(UIColor*)colorWithHexString:(NSString*)hex
{
    NSString *cString = [[hex stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] uppercaseString];


    if ([cString length] < 6) return [UIColor grayColor];

    if ([cString hasPrefix:@"0X"]) cString = [cString substringFromIndex:2];

    if ([cString length] != 6) return  [UIColor grayColor];

    NSRange range;
    range.location = 0;
    range.length = 2;
    NSString *rString = [cString substringWithRange:range];

    range.location = 2;
    NSString *gString = [cString substringWithRange:range];

    range.location = 4;
    NSString *bString = [cString substringWithRange:range];

    unsigned int r, g, b;
    [[NSScanner scannerWithString:rString] scanHexInt:&r];
    [[NSScanner scannerWithString:gString] scanHexInt:&g];
    [[NSScanner scannerWithString:bString] scanHexInt:&b];

    return [UIColor colorWithRed:((float) r / 255.0f)
                         green:((float) g / 255.0f)
                          blue:((float) b / 255.0f)
                         alpha:1.0f];
}
Pengembang MahboobiOS
sumber