Bagaimana cara menyesuaikan warna latar belakang UITableViewCell?

188

Saya ingin menyesuaikan latar belakang (dan mungkin juga perbatasan) dari semua UITableViewCells dalam UITableView saya. Sejauh ini saya belum dapat menyesuaikan hal ini, jadi saya memiliki banyak sel latar belakang putih yang merupakan default.

Apakah ada cara untuk melakukan ini dengan iPhone SDK?

jpm
sumber

Jawaban:

193

Anda perlu mengatur backgroundColor konten selMelihat warna Anda. Jika Anda menggunakan aksesori (seperti panah pengungkapan, dll.), Mereka akan muncul sebagai putih, jadi Anda mungkin perlu menggulung versi khusus itu.

Ben Gottlieb
sumber
108
mis. myCell.contentView.backgroundColor = [UIColor greenColor];
JoBu1324
1
Jawaban vlado.grigorov lebih fleksibel - lihat jawaban William Denniss '
JoBu1324
3
Adakah tautan tentang cara menggulung milik sendiri UITableViewCellAccessoryCheckmark, misalnya? Terima kasih.
Dan Rosenstark
6
Untuk melihatnya kadang-kadang Anda perlu mengatur:cell.textLabel.backgroundColor = [UIColor clearColor];
Evan Moran
205

Berikut adalah cara paling efisien yang saya temui untuk menyelesaikan masalah ini, gunakan metode delegasi willDisplayCell (ini menangani warna putih untuk latar belakang label teks juga saat menggunakan cell.textLabel.text dan / atau cell.detailTextLabel.text ):

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { ... }

Ketika metode pendelegasian ini disebut warna sel dikontrol melalui sel daripada tampilan tabel, seperti ketika Anda menggunakan:

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { ... }

Jadi di dalam tubuh metode delegasi sel tambahkan kode berikut untuk mengganti warna sel atau cukup gunakan pemanggilan fungsi untuk membuat semua sel tabel warna yang sama.

if (indexPath.row % 2)
{
    [cell setBackgroundColor:[UIColor colorWithRed:.8 green:.8 blue:1 alpha:1]];
}
else [cell setBackgroundColor:[UIColor clearColor]];

Solusi ini bekerja dengan baik dalam keadaan saya ...

Nathan B.
sumber
Ini adalah solusi yang lebih bersih. Sebagian besar solusi lain memerlukan subkelas UITableViewCell. Solusi vlado.grigorov tidak bekerja untuk saya.
Ronnie Liew
Memang, dan ini adalah metode yang Apple rekomendasikan sesuai dengan berbagai presentasi WWDC yang telah saya lihat.
Mike Weller
Bagus - KECUALI saat Anda perlu menambahkan baris baru di bagian atas daftar. Metode ini membuat semua tambahan warna yang sama. Refresh memperbaikinya, tetapi membutuhkan waktu yang tidak perlu. Ditemukan kemarin ...
JOM
Ini tampaknya bekerja dengan baik, kecuali saat menggunakan Data Inti. Sel-sel baru yang ditambahkan melalui NSFetchedResultsController tampaknya tidak memanggil willDisplayCell dengan benar. Saya bingung membuatnya bekerja ...
Radven
Baris yang setara untuk pengaturan warna latar belakang dalam Swift 2.0:cell.backgroundColor = UIColor.clearColor
kbpontius
104

Ini sangat sederhana, karena OS 3.0 hanya mengatur warna latar belakang sel dalam metode willDisplayCell. Anda tidak boleh mengatur warna di cellForRowAtIndexPath.

Ini berfungsi baik untuk gaya polos dan dikelompokkan:

Kode:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = [UIColor redColor];
}

PS: Di sini ekstrak dokumentasi untuk willDisplayCell:

"Tampilan tabel mengirimkan pesan ini kepada delegasinya tepat sebelum ia menggunakan sel untuk menggambar sebuah baris, sehingga memungkinkan delegasi untuk menyesuaikan objek sel sebelum ditampilkan. Metode ini memberikan delegasi kesempatan untuk menimpa properti berbasis negara yang ditetapkan sebelumnya oleh tampilan tabel, seperti pemilihan dan warna latar belakang. Setelah delegasi kembali, tampilan tabel hanya menetapkan properti alfa dan bingkai, dan kemudian hanya ketika menjiwai baris saat slide masuk atau keluar. "

Saya menemukan informasi ini di pos ini dari colionel . Terima kasih dia

Seba
sumber
3
Ini harus ditandai sebagai jawaban yang benar karena Anda bahkan tidak perlu melakukan apa pun jika Anda memiliki pengungkapan keterbukaan
Ashish Awaghad
1
Ini tidak berfungsi jika Anda ingin warna latar sel yang berbeda dengan latar belakang tampilan tabel untuk saya.
Chris
Untuk sel grup, Anda dapat mengaturnya di cellForRow
Sharen Eayrs
58

Pendekatan terbaik yang saya temukan sejauh ini adalah untuk mengatur tampilan latar belakang sel dan latar belakang yang jelas dari subview sel. Tentu saja, ini terlihat bagus di meja dengan gaya terindeks saja, tidak peduli dengan atau tanpa aksesori.

Berikut adalah contoh di mana latar belakang sel terengah-engah kuning:

UIView* backgroundView = [ [ [ UIView alloc ] initWithFrame:CGRectZero ] autorelease ];
backgroundView.backgroundColor = [ UIColor yellowColor ];
cell.backgroundView = backgroundView;
for ( UIView* view in cell.contentView.subviews ) 
{
    view.backgroundColor = [ UIColor clearColor ];
}
Vladimir Grigorov
sumber
1
Jika Anda melakukan ini, pastikan untuk mengatur properti buram menjadi TIDAK juga.
Lily Ballard
11
Menggunakan kontrol sel transparan benar-benar tidak dianjurkan. Kinerja pengguliran akan banyak dipengaruhi oleh karena itu Apple selalu mengatakan untuk menggunakan kontrol buram.
Mike Weller
3
Di iOS 4.2 dan yang lebih baru sepertinya loop tidak lagi diperlukan.
Frank Schmitt
Sangat bagus. Berfungsi sempurna saat menggunakan tampilan aksesori !!
RyanG
19

Sederhananya dalam file kelas delegasi UITableView Anda (.m):

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell  forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UIColor *color = ((indexPath.row % 2) == 0) ? [UIColor colorWithRed:255.0/255 green:255.0/255 blue:145.0/255 alpha:1] : [UIColor clearColor];
    cell.backgroundColor = color;
}
PERASAAN
sumber
7

Saya setuju dengan Seba, saya mencoba untuk mengatur warna baris bergantian dalam metode delegasi rowForIndexPath tetapi mendapatkan hasil yang tidak konsisten antara 3,2 dan 4,2. Berikut ini berhasil bagi saya.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    if ((indexPath.row % 2) == 1) {
        cell.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.textLabel.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }
    else
    {
        cell.backgroundColor = [UIColor whiteColor];
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }

}
cipherz
sumber
1
Masih tidak mengerti mengapa pengaturannya di willDisplayCell membuat perbedaan. Disebut demikian, apakah kita menerapkannya atau tidak?
Sharen Eayrs
6

Setelah mencoba semua solusi yang berbeda, metode berikut adalah yang paling elegan. Ubah warna dalam metode delegasi berikut:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (...){
        cell.backgroundColor = [UIColor blueColor];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
}
Jim Huang
sumber
4

vlado.grigorov memiliki beberapa saran yang bagus - cara terbaik adalah membuat backgroundView, dan memberikan warna, mengatur segalanya untuk clearColor. Juga, saya pikir cara itu adalah satu-satunya cara untuk membersihkan warna dengan benar (coba sampelnya - tetapi atur 'clearColor' alih-alih 'yellowColor'), yang merupakan apa yang saya coba lakukan.

William Denniss
sumber
Keuntungan dari pendekatan ini adalah Anda dapat mempertahankan warna pada properti waktu desain di Interface Builder. Satu masalah desain yang kurang membutuhkan interaksi pengembang.
whitneyland
1
cell.backgroundView = [[[Alokasi UIVi] initWithFrame: cell.bounds] autorelease]; cell.backgroundView.backgroundColor = [UIColor redColor];
Brian
3

Menyesuaikan latar belakang sel tampilan tabel akhirnya menjadi dan "semua atau tidak sama sekali" pendekatan. Sangat sulit untuk mengubah warna atau gambar yang digunakan untuk latar belakang sel konten dengan cara yang tidak terlihat aneh.

Alasannya adalah bahwa sel benar-benar menjangkau lebar tampilan. Sudut bundar hanyalah sebagian dari gaya gambarnya dan tampilan konten berada di area ini.

Jika Anda mengubah warna sel konten Anda akan berakhir dengan bit putih terlihat di sudut-sudut. Jika Anda mengubah warna seluruh sel, Anda akan memiliki blok warna yang membentang lebar tampilan.

Anda pasti dapat menyesuaikan sel, tetapi itu tidak semudah yang Anda pikirkan pada awalnya.

Andrew Grant
sumber
1
Ini benar untuk sel di tabel yang dikelompokkan, tetapi tabel polos tidak perlu terlalu dikhawatirkan. Sel tanpa hiasan tanpa aksesori seharusnya terlihat bagus.
Ben Gottlieb
Ben - poin bagus. Saya terutama menggunakan tabel yang dikelompokkan tetapi seperti yang Anda sebutkan tabel sederhana tidak menderita masalah ini.
Andrew Grant
3

Buat tampilan dan atur ini sebagai tampilan latar belakang sel

UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
            [lab setBackgroundColor:[UIColor grayColor]];
            cell.backgroundView = lab;
            [lab release];
Senthil
sumber
3

Untuk memperluas jawaban N.Berendt - Jika Anda ingin mengatur warna sel berdasarkan pada beberapa keadaan dalam objek data sel yang sebenarnya, pada saat itu Anda mengonfigurasi sisa informasi untuk sel tabel, yang biasanya ketika Anda berada di metode cellForRowAtIndexPath, Anda dapat melakukan ini dengan mengganti metode willDisplayCell untuk mengatur warna latar belakang sel dari warna latar belakang tampilan konten - ini dapat mengatasi masalah latar belakang tombol pengungkapan dll. tidak benar tetapi masih memungkinkan Anda mengontrol warna dalam metode cellForRowAtIndexPath di mana Anda melakukan semua kustomisasi sel Anda yang lain.

Jadi: Jika Anda menambahkan metode ini ke delegasi tampilan tabel Anda:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = cell.contentView.backgroundColor;
}

Kemudian dalam metode cellForRowAtIndexPath Anda dapat Anda lakukan:

if (myCellDataObject.hasSomeStateThatMeansItShouldShowAsBlue) {
    cell.contentView.backgroundColor = [UIColor blueColor];
}

Ini menghemat harus mengambil objek data Anda lagi dalam metode willDisplayCell dan juga menyimpan memiliki dua tempat di mana Anda menyesuaikan / kustomisasi sel tabel Anda - semua kustomisasi bisa masuk dalam metode cellForRowAtIndexPath.

gamozzii
sumber
3

Buat gambar untuk digunakan sebagai latar belakang dengan Photoshop atau gimp dan beri nama myimage. Kemudian, tambahkan metode ini ke kelas tableViewController Anda:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    UIImage *cellImage = [UIImage imageNamed:@"myimage.png"];//myimage is a 20x50 px with  gradient  color created with gimp
    UIImageView *cellView = [[UIImageView alloc] initWithImage:cellImage];
    cellView.contentMode = UIContentViewModeScaleToFill;
    cell.backgroundView = cellView;
    //set the background label to clear
    cell.titleLabel.backgroundColor= [UIColor clearColor];
}

Ini juga akan berfungsi jika Anda telah mengatur UITableView ke kustom di inspektur atribut.

Davide
sumber
2

Solusi saya adalah menambahkan kode berikut ke acara cellForRowAtIndexPath:

UIView *solidColor = [cell viewWithTag:100];
if (!solidColor) {

    solidColor = [[UIView alloc] initWithFrame:cell.bounds];
    solidColor.tag = 100; //Big tag to access the view afterwards
    [cell addSubview:solidColor];
    [cell sendSubviewToBack:solidColor];
    [solidColor release];
}
solidColor.backgroundColor = [UIColor colorWithRed:254.0/255.0
                                             green:233.0/255.0
                                              blue:233.0/255.0
                                             alpha:1.0];

Bekerja dalam keadaan apa pun, bahkan dengan tombol pengungkapan, dan lebih baik untuk logika Anda untuk bertindak pada keadaan warna sel di cellForRowAtIndexPath daripada di event cellWillShow, saya pikir.

albertoFlagSolutions
sumber
1

Subkelas UITableViewCell dan tambahkan ini dalam implementasi:

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
}
JonahGabriel
sumber
1
    UIView *bg = [[UIView alloc] initWithFrame:cell.frame];
    bg.backgroundColor = [UIColor colorWithRed:175.0/255.0 green:220.0/255.0 blue:186.0/255.0 alpha:1]; 
    cell.backgroundView = bg;
    [bg release];
Bhavesh Nayi
sumber
1

Ini akan bekerja di Xcode terbaru.

-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
    cell.backgroundColor = [UIColor grayColor];
}
Sameera R.
sumber
0

Coba ini:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
Pang
sumber