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)
-(UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero // override any margins inc. safe area
}
(cepat 4.2):
override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }
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 pengaturannya NO
akan memungkinkan pengaturan sel layoutMargin
untuk menimpa apa pun layoutMargin
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 AndapreservesSuperviewLayoutMargins=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:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
// Remove seperator inset
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
// Prevent the cell from inheriting the Table View's margin settings
if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
[cell setPreservesSuperviewLayoutMargins:NO];
}
// Explictly set your cell's layout margins
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
Swift 4:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// Remove seperator inset
if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
cell.separatorInset = .zero
}
// Prevent the cell from inheriting the Table View's margin settings
if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
cell.preservesSuperviewLayoutMargins = false
}
// Explictly set your cell's layout margins
if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
cell.layoutMargins = .zero
}
}
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:
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
// Force your tableview margins (this may be a bad idea)
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
Swift 4:
func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Force your tableview margins (this may be a bad idea)
if tableView.responds(to: #selector(setter: UITableView.separatorInset)) {
tableView.separatorInset = .zero
}
if tableView.responds(to: #selector(setter: UITableView.layoutMargins)) {
tableView.layoutMargins = .zero
}
}
... 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.
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
Swift 4:
if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}
(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 ...