Saya memiliki aplikasi tempat UITableView
inset pemisah diatur ke nilai khusus - Kanan 0
, Kiri 0
. Ini berfungsi dengan baik iOS 7.x
, namun dalam iOS 8.0
saya melihat bahwa inset pemisah diatur ke default 15
di sebelah kanan. Meskipun dalam file xib yang diaturnya 0
, masih muncul salah.
Bagaimana cara menghapus UITableViewCell
margin pemisah?
ios
objective-c
swift
uitableview
ios8
pengguna3570727
sumber
sumber
[UIColor clearColor]
dan menggambar pemisah Anda sendiri. Anda jauh lebih fleksibel dengan cara itu.UITableViewCellSeparatorStyle
default. Bahkan jawaban yang diterima adalah hack yang sangat kotor menurut saya.Jawaban:
iOS 8.0 memperkenalkan properti layoutMargins pada tampilan sel DAN tabel.
Properti ini tidak tersedia di iOS 7.0 jadi Anda perlu memastikan Anda memeriksa sebelum menugaskannya!
Perbaikan yang mudah adalah dengan subkelas sel Anda dan menimpa properti tata letak margin seperti yang disarankan oleh @ user3570727. Namun Anda akan kehilangan perilaku sistem seperti mewarisi margin dari Area Aman jadi saya tidak merekomendasikan solusi di bawah ini:
(ObjectiveC)
(cepat 4.2):
Jika Anda tidak ingin menimpa properti, atau perlu mengaturnya secara kondisional, teruskan membaca.
Selain
layoutMargins
properti, Apple telah menambahkan properti ke sel Anda yang akan mencegahnya mewarisi pengaturan margin Table View Anda. Saat properti ini disetel, sel Anda diizinkan untuk mengonfigurasi marginnya sendiri secara terpisah dari tampilan tabel. Anggap saja sebagai penggantian.Properti ini dipanggil
preservesSuperviewLayoutMargins
, dan pengaturannyaNO
akan memungkinkan pengaturan sellayoutMargin
untuk menimpa apa punlayoutMargin
yang diatur pada TableView Anda. Keduanya menghemat waktu ( Anda tidak perlu mengubah pengaturan Tampilan Tabel ), dan lebih ringkas. Silakan merujuk ke jawaban Mike Abdullah untuk penjelasan terperinci.CATATAN: yang berikut adalah implementasi bersih untuk pengaturan margin level sel , seperti yang dinyatakan dalam jawaban Mike Abdullah. Pengaturan sel Anda
preservesSuperviewLayoutMargins=NO
akan memastikan bahwa Tampilan Tabel Anda tidak mengesampingkan pengaturan sel. Jika Anda benar-benar ingin seluruh tampilan tabel memiliki margin konsisten, harap sesuaikan kode Anda.Siapkan margin sel Anda:
Swift 4:
Menyetel
preservesSuperviewLayoutMargins
properti pada sel Anda ke NO harus mencegah tampilan tabel Anda mengesampingkan margin sel Anda. Dalam beberapa kasus, sepertinya tidak berfungsi dengan baik.Jika semuanya gagal, Anda dapat memaksa margin Table View Anda:
Swift 4:
... dan itu dia! Ini harus bekerja di iOS 7 dan 8.
EDIT: Mohamed Saleh dibawa ke perhatian saya kemungkinan perubahan di iOS 9. Anda mungkin perlu mengatur Table View ini
cellLayoutMarginsFollowReadableWidth
untukNO
jika Anda ingin menyesuaikan insets atau margin. Jarak tempuh Anda mungkin bervariasi, ini tidak didokumentasikan dengan baik.Properti ini hanya ada di iOS 9 jadi pastikan untuk memeriksa sebelum pengaturan.
Swift 4:
(kode di atas dari iOS 8 UITableView separator inset 0 tidak berfungsi )
EDIT: Berikut ini pendekatan Pembuat Antarmuka murni:
CATATAN: iOS 11 mengubah & menyederhanakan banyak perilaku ini, pembaruan akan segera ...
sumber
cell.preservesSuperviewLayoutMargins = NO
per @ bffmike atau setelah menggulir cara inset akan muncul. (wtf ??)cell.preservesSuperviewLayoutMargins
dalam metode sumber data saya:- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Arg !!! Setelah bermain-main baik melakukan ini di
Cell
subclass Anda :atau mengatur
cell.layoutMargins = UIEdgeInsetsZero;
perbaikan untuk saya.sumber
separatorInset
dalam IB tidak berhasil. ada juga masalah dengan warna latar belakang tampilan tabel. ini benar-benar sakit.Mari luangkan waktu sejenak untuk memahami masalah sebelum mengisi daya secara membabi buta untuk berupaya memperbaikinya.
Poke cepat di debugger akan memberi tahu Anda bahwa garis pemisah adalah subview
UITableViewCell
. Tampaknya sel itu sendiri mengambil cukup banyak tanggung jawab untuk tata letak garis-garis ini.iOS 8 memperkenalkan konsep margin tata letak . Secara default, margin tata letak tampilan ada
8pt
di semua sisi, dan margin tersebut diwarisi dari tampilan leluhur.Sebaiknya kita tahu, ketika meletakkan garis pemisahnya,
UITableViewCell
memilih untuk menghormati margin tata letak sebelah kiri, menggunakannya untuk membatasi inset kiri.Menyatukan semua itu, untuk mencapai inset yang diinginkan benar-benar nol, kita perlu:
0
Dengan kata lain, ini adalah tugas yang cukup sederhana untuk dicapai:
Hal yang perlu diperhatikan:
preservesSuperviewLayoutMargins
jika diinginkan.preservesSuperviewLayoutMargins
, Anda dapat mengonfigurasi pandangan leluhur (seperti tabel) untuk0
meninggalkan margin juga, tetapi ini tampaknya lebih rentan terhadap kesalahan karena Anda tidak mengontrol keseluruhan hierarki.0
dan membiarkan yang lain.UITableView
menarik di bagian bawah tabel gaya biasa, saya menduga itu akan memerlukan menetapkan pengaturan yang sama di tingkat tabel juga (belum mencoba yang ini!)sumber
[self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)];
layoutMargins
danpreservesSuperviewLayoutMargins
pada sel adalah semua yang diperlukan. Ada hal lain yang terasa seperti percaya pada voodoo.separatorInset
aUITableViewCell
di iOS 8, Anda harus mengatur setUIEdgeInsets
ke nol di keduaUITableView
danUITableViewCell
. Jika Anda tidak melakukan keduanya, Anda akan tetap memiliki inset kiri yang lebih besar dari nol. Saya sudah mengkonfirmasi ini beberapa kali.Saya percaya ini adalah pertanyaan yang sama yang saya tanyakan di sini: Hapus SeparatorInset di iOS 8 UITableView untuk XCode 6 iPhone Simulator
Di iOS 8 , ada satu properti baru untuk semua objek yang diwarisi darinya
UIView
. Jadi, solusi untuk mengaturSeparatorInset
di iOS 7.x tidak akan dapat menghapus ruang putih yang Anda lihat di UITableView di iOS 8.Properti baru disebut " layoutMargins ".
Solusinya:-
Jika Anda mengatur
cell.layoutMargins = UIEdgeInsetsZero;
tanpa memeriksa apakahlayoutMargins
ada, aplikasi akan macet di iOS 7.x. Jadi, cara terbaik akan memeriksa apakahlayoutMargins
ada terlebih dahulusetLayoutMargins:UIEdgeInsetsZero
.sumber
Anda dapat menggunakan tampilan UIA sekali, saat startup aplikasi Anda (sebelum UI dimuat), untuk menjadikannya sebagai pengaturan global default:
Dengan cara ini, Anda menjaga kode UIViewController Anda tetap bersih dan selalu dapat menimpanya jika Anda mau.
sumber
iOS memperkenalkan properti layoutMargins pada tampilan sel DAN tabel.
Properti ini tidak tersedia di iOS 7.0 jadi Anda perlu memastikan Anda memeriksa sebelum menugaskannya!
Namun, Apple telah menambahkan properti yang disebut preservesSuperviewLayoutMargins ke sel Anda yang akan mencegahnya mewarisi pengaturan margin Table View Anda. Dengan cara ini, sel Anda dapat mengonfigurasi marginnya sendiri secara terpisah dari tampilan tabel. Anggap saja sebagai penggantian.
Properti ini disebut preservesSuperviewLayoutMargins , dan menyetelnya ke TIDAK dapat memungkinkan Anda untuk mengesampingkan pengaturan LayMagin Table View Anda dengan pengaturan LayMargin sel Anda sendiri. Keduanya menghemat waktu ( Anda tidak harus mengubah pengaturan Table View ), dan lebih ringkas. Silakan merujuk ke jawaban Mike Abdullah untuk penjelasan terperinci.
CATATAN: ini adalah implementasi yang tepat dan tidak berantakan, seperti yang dinyatakan dalam jawaban Mike Abdullah; mengatur sel Anda preservesSuperviewLayoutMargins = TIDAK akan memastikan bahwa Tampilan Tabel Anda tidak mengesampingkan pengaturan sel.
Langkah pertama - Siapkan margin sel Anda:
Menyetel properti preservesSuperviewLayoutMargins pada sel Anda ke NO harus mencegah tampilan tabel Anda mengesampingkan margin sel Anda. Dalam beberapa kasus, sepertinya tidak berfungsi dengan baik.
Langkah kedua - Hanya jika semua gagal, Anda dapat memaksa margin Table View Anda:
... dan itu dia! Ini harus bekerja di iOS 8 dan juga iOS 7.
Catatan: diuji menggunakan iOS 8.1 dan 7.1, dalam kasus saya, saya hanya perlu menggunakan langkah pertama dari penjelasan ini.
Langkah Kedua hanya diperlukan jika Anda memiliki sel tidak berpenghuni di bawah sel yang diberikan, yaitu. jika tabel lebih besar dari jumlah baris dalam model tabel. Tidak melakukan langkah kedua akan menghasilkan offset pemisah yang berbeda.
sumber
willDisplayCell
metode karena metode itu sendiri sudah iOS 8+ dan tidak akan pernah dipanggil dari versi yang lebih lama.Di Swift, ini sedikit lebih menyebalkan karena
layoutMargins
merupakan properti, jadi Anda harus mengganti pengambil dan penyetel.Ini secara efektif akan membuat hanya
layoutMargins
baca, yang dalam kasus saya baik-baik saja.sumber
Untuk iOS 9 Anda perlu menambahkan:
Untuk lebih jelasnya silakan merujuk ke pertanyaan .
sumber
Saya hanya ingin berbagi ekstensi yang saya buat untuk menghapus margin dari pemisah sel tampilan tabel.
Digunakan dalam konteks:
sumber
Cepat:
sumber
Saya membuatnya bekerja dengan melakukan ini:
sumber
Seperti apa yang disarankan cdstamper daripada tampilan tabel, menambahkan baris di bawah ini dalam metode layoutSubview sel bekerja untuk saya.
sumber
Contoh Swift 3.0:
sumber
Setelah banyak penyelidikan ...
Inilah satu-satunya cara untuk sepenuhnya mengendalikan hal ini (yang dapat saya temukan)
Untuk mengontrol sepenuhnya inset pemisah dan margin tata letak pada setiap sel. Lakukan ini dalam
willDisplayCell
metode pada AndaUITableviewDelegate
.Objek sel mengontrol pemisah, dan
contentView
mengontrol yang lainnya. Jika ruang inset pemisah Anda muncul dalam warna yang tidak terduga, ini harus menyelesaikannya:sumber
Solusi sederhana di Swift untuk iOS 8 dengan kustom
UITableViewCell
Dengan cara ini Anda menetapkan
layoutMargin
danseparatorInset
hanya satu kali alih-alih melakukannya untuk masing-masingwillDisplayCell
seperti kebanyakan jawaban di atas menyarankan.Jika Anda menggunakan kebiasaan,
UITableViewCell
ini adalah tempat yang tepat untuk melakukannya. Kalau tidak, Anda harus melakukannyatableView:cellForRowAtIndexPath
.Hanya petunjuk lain: Anda tidak perlu mengatur
preservesSuperviewLayoutMargins = false
karena nilai default sudahNO
!sumber
Bagi saya garis sederhana melakukan pekerjaan
sumber
Cukup tambahkan kode di bawah ini untuk menyelesaikan program ini.
Semoga beruntung untukmu!
sumber
Lukasz menjawab dalam Swift:
sumber
Ini adalah kode yang berfungsi untuk saya, di Swift:
Ini tampaknya paling bersih bagi saya (untuk saat ini), karena semua sel / tableView edge / margin penyesuaian dilakukan dalam
tableView:willDisplayCell:forRowAtIndexPath:
metode ini, tanpa menjejalkan kode yang tidak perlu ke dalamtableView:cellForRowAtIndexPath:
.Btw, saya hanya mengatur separatorInset / layoutMargins kiri sel, karena dalam hal ini saya tidak ingin mengacaukan kendala saya yang telah saya atur di sel saya.
Kode diperbarui ke Swift 2.2:
sumber
Kebanyakan jawaban yang menunjukkan insets pemisah dan tata letak margin yang ditetapkan melalui berbagai metode (yaitu,
viewDidLayoutSubviews
,willDisplayCell
, dll) untuk sel dan tableviews, tapi aku telah menemukan bahwa hanya menempatkan ini dalamcellForRowAtIndexPath
karya-karya besar. Sepertinya cara terbersih.sumber
Gunakan cuplikan kode di bawah ini untuk menghindari masalah bantalan yang tidak diinginkan untuk UITableView di iOS 8 & 7.
sumber
Alih-alih memperbarui
preservesSuperviewLayoutMargins
danlayoutMargins
setiap kali sel menggulir (menggunakanwillDisplayCell
), saya sarankan untuk melakukannya sekali dalamcellForRowAtIndexPath:
:sumber
Berikut cara mudah untuk menghapus inset secara global.
Dalam
UITableViewCell+Extensions.swift
:Dalam
AppDelegate
application:didFinishLaunchingWithOptions:
:Anda mungkin berpikir untuk a) juga hanya mengganti
separatorInset
dalam ekstensi, atau b) mengatur proxy penampilanlayoutMargins
. Tidak akan bekerja. MeskipunseparatorInset
diindikasikan sebagai properti, mencoba menimpanya sebagai properti (atau metode) menghasilkan kesalahan kompilator. Dan pengaturan proxy penampilan untukUITableViewCell
'slayoutMargins
(atau, dalam hal ini, juga pengaturan proxy penampilan untukUITableView
' slayoutMargins
danseparatorInset
) tidak berpengaruh.sumber
Di iOS8:
Menambahkan ini ke Subclass UITableViewCell saya:
dan ini untuk "tableView: cellForRowAtIndexPath" atau "tableView: willDisplayCell":
BEKERJA untuk saya.
sumber
Untuk sel tertentu yang ingin Anda sembunyikan pemisah.
sumber
Setelah melihat jawaban di lantai 3, saya mencoba mencari tahu apa hubungan pengaturan pemisah antara TableView & TableViewCell dan melakukan beberapa tes. Inilah kesimpulan saya:
kita dapat mempertimbangkan bahwa mengatur pemisah sel ke nol harus memindahkan pemisah dalam dua langkah: langkah pertama adalah mengatur pemisah sel ke nol. Langkah kedua adalah mengatur marginlayout sel ke nol.
mengatur setel separatorins TableView dan marginlayout dapat mempengaruhi setel separatorinset Cell . Namun, dari pengujian, saya menemukan bahwa separatorinset TableView tampaknya tidak berguna, marginlayout TableView sebenarnya dapat mempengaruhi marginlayout sel .
atur Cell's PreservesSuperviewLayoutMargins = false, dapat memotong efek marginlayout TableView pada Sel.
salah satu solusinya:
sumber
Ini solusi saya. Ini berlaku untuk subkelas sel khusus, cukup tambahkan keduanya ke subkelas.
2.
Dan akan lebih mudah jika Anda dapat menyesuaikan posisi pemisah tanpa meminta desainer Anda untuk menggambar satu untuk Anda ..........
sumber
Dengan cara yang lebih ringkas daripada jawaban yang paling banyak dipilih ...
}
sumber
Menambahkan potongan ini, elegan sederhana di Swift bekerja untuk saya di iOS8 :)
sumber
Ini bekerja dengan baik untuk saya di iOS 8 dan iOS 9.
Untuk OBJ-C
sumber