Saya menerapkan tampilan tabel pemilih warna di mana pengguna dapat memilih di antara, katakanlah, 10 warna (tergantung pada produk). Pengguna juga dapat memilih opsi lain (seperti kapasitas hard drive, ...).
Semua pilihan warna ada di dalam bagian tampilan tabel mereka sendiri.
Saya ingin menampilkan kotak kecil di sebelah kiri textLabel yang menunjukkan warna sebenarnya.
Saat ini saya sedang menambahkan kotak UIView sederhana, berikan warna latar yang benar, seperti ini:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:RMProductAttributesCellID];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:RMProductAttributesCellID] autorelease];
cell.indentationWidth = 44 - 8;
UIView *colorThumb = [[[UIView alloc] initWithFrame:CGRectMake(8, 8, 28, 28)] autorelease];
colorThumb.tag = RMProductAttributesCellColorThumbTag;
colorThumb.hidden = YES;
[cell.contentView addSubview:colorThumb];
}
RMProductAttribute *attr = (RMProductAttribute *)[_product.attributes objectAtIndex:indexPath.section];
RMProductAttributeValue *value = (RMProductAttributeValue *)[attr.values objectAtIndex:indexPath.row];
cell.textLabel.text = value.name;
cell.textLabel.backgroundColor = [UIColor clearColor];
UIView *colorThumb = [cell viewWithTag:RMProductAttributesCellColorThumbTag];
colorThumb.hidden = !attr.isColor;
cell.indentationLevel = (attr.isColor ? 1 : 0);
if (attr.isColor) {
colorThumb.layer.cornerRadius = 6.0;
colorThumb.backgroundColor = value.color;
}
[self updateCell:cell atIndexPath:indexPath];
return cell;
}
Ini menampilkan baik-baik saja tanpa masalah.
Satu-satunya masalah saya adalah ketika saya memilih baris "warna", selama animasi pemilihan fade-to-blue, UIView khusus saya (colorThumb) disembunyikan. Ini akan terlihat lagi tepat setelah animasi pemilihan / deseleksi berakhir, tetapi ini menghasilkan artefak yang jelek.
Apa yang harus saya lakukan untuk memperbaikinya? Bukankah saya harus memasukkan subview di tempat yang tepat?
(Tidak ada yang istimewa di didSelectRowAtIndexPath, saya hanya mengganti aksesori sel ke kotak centang atau tidak sama sekali, dan batal memilih indexPath saat ini).
sumber
Jawaban:
UITableViewCell
mengubah warna latar belakang dari semua sub pandangan ketika sel yang dipilih atau disorot, Anda dapat Memecahkan masalah ini dengan menimpa Tableview selsetSelected:animated
dansetHighlighted:animated
dan ulang warna tampilan background.Dalam Tujuan C:
Dalam Swift 3.1:
sumber
if (highlighted)
danif (selected)
ketentuannya? Saya pikir itu akan berhasil jika kita tidak memiliki kondisi itu.Itu karena sel tampilan tabel secara otomatis mengubah warna latar belakang semua tampilan di dalam tampilan konten untuk keadaan yang disorot. Anda dapat mempertimbangkan subkelas
UIView
untuk menggambar warna Anda atau menggunakanUIImageView
dengan gambar peregangan 1x1 px khusus.sumber
setHighlighted:animated:
dansetSelected:animated:
Menemukan solusi yang cukup elegan alih-alih mengacaukan metode seleksi / penyorotan tableViewCell. Anda dapat membuat subkelas UIView yang mengabaikan pengaturan warna latar belakangnya menjadi warna yang jelas.
Cepat 3/4:
Swift 2:
Versi obj-C:
sumber
Cara lain untuk mengelola masalah adalah mengisi tampilan dengan gradien inti-grafis, seperti:
sumber
Untuk Swift 2.2 ini berfungsi
dan alasan dijelaskan oleh @ Andriy
sumber
Terinspirasi oleh Yatheesha BL 's jawaban saya membuat sebuah UITableViewCell kategori / ekstensi yang memungkinkan Anda untuk menghidupkan dan mematikan transparansi ini 'fitur'.
Cepat
Objektif-C
KeepBackgroundCell kompatibel dengan CocoaPods. Anda dapat menemukannya di GitHub
sumber
Anda bisa
cell.selectionStyle = UITableViewCellSelectionStyleNone;
, lalu atur backgroundColor di- (void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath
sumber
Terinspirasi oleh jawaban Yatheesha BL .
Jika Anda memanggil super.setSelected (terpilih, animasi: animasi), itu akan menghapus semua warna latar yang Anda atur . Jadi, kami tidak akan memanggil metode super.
Dalam Swift:
sumber
Untuk kasus, Ini adalah Septs untuk menghindari mendapatkan warna abu-abu untuk semua item dalam sel (jika Anda menggunakan sel tampilan tabel kustom):
Setel selectionStyle ke .none 👉
selectionStyle = .none
Ganti metode ini.
Panggil super, untuk mendapatkan manfaat dari pengaturan super.
Lakukan apa yang pernah menyoroti logika yang Anda inginkan.
sumber
UITableViewCell mengubah backgroundColor semua subview pada pilihan karena beberapa alasan.
Ini mungkin membantu:
DVColorLockView
Gunakan sesuatu seperti itu untuk menghentikan UITableView mengubah warna tampilan Anda selama pemilihan.
sumber
Gambarkan tampilan alih-alih mengatur warna latar belakang
sumber
Solusi SIMPLEST tanpa bug dengan animasi (seperti pada jawaban teratas) dan tanpa subkelas dan gambar - atur warna batas layer alih-alih warna latar belakang dan atur lebar batas yang sangat besar.
sumber
Coba kode berikut:
sumber
Jangan lupa untuk menimpanya
setSelected
jugasetHighlighted
sumber
Ini mirip dengan jawaban Pavel Gurov, tetapi lebih fleksibel karena memungkinkan warna apa pun menjadi permanen.
sumber
Saya ingin mempertahankan perilaku pemilihan default kecuali satu subview sel yang ingin saya abaikan perubahan warna latar belakang otomatis. Tapi saya juga harus bisa mengubah warna latar di waktu lain.
Solusi yang saya buat adalah dengan subclass
UIView
sehingga mengabaikan pengaturan warna latar belakang secara normal dan menambahkan fungsi terpisah untuk memintas perlindungan.Cepat 4
sumber
di sini adalah solusi saya, gunakan contentView untuk menunjukkan selectionColor, ini berfungsi dengan baik
sumber
Tempatkan kode ini di subclass Anda dari
UITableViewCell
Sintaks Swift 3
sumber
Menambahkan solusi lain jika Anda menggunakan storyboard. Buat subkelas
UIView
yang tidak memungkinkanbackgroundColor
untuk diatur setelah awalnya ditetapkan.sumber
Jika solusi latar belakang yang disebutkan di atas tidak memperbaiki masalah Anda, masalah Anda mungkin terletak pada Anda
datasource
untuk tableView Anda.Bagi saya, saya sedang membuat turunan dari objek DataSource (dipanggil
BoxDataSource
) untuk menangani metode delegasi dan tableSource dataView, seperti:Ini menyebabkan dataSource untuk tidak dialokasikan setiap kali sel disadap, dan dengan demikian semua konten menghilang. Alasannya, adalah ARC deallocating / sifat pengumpulan sampah.
Untuk memperbaikinya, saya harus masuk ke sel khusus, menambahkan variabel sumber data:
Kemudian, Anda perlu mengatur dataSource ke dataSource sel yang
var
baru saja Anda buat di cellForRow, jadi ini tidak dapat dialokasikan dengan ARC.Semoga itu bisa membantu.
sumber