Cara mengatur pemisah lebar penuh di UITableView

149

Saya punya tempat di UITableViewmana pemisah tidak memiliki lebar penuh. Itu berakhir seperti 10 piksel sebelum sisi kiri. Saya bermain - main dengan kode ini di viewDidLoad().

self.tableView.layoutMargins = UIEdgeInsetsZero;

Juga di storyboard ketika Anda dapat memilih penyeleksi kustom atau default. Sekarang semua sel yang dihuni tidak memiliki selektor lebar penuh tetapi sel yang kosong memiliki lebar penuh.

Bagaimana saya bisa memperbaikinya?

Timo Cengiz
sumber
9
UITableViewmemiliki properti separatorInset. Atur inset UITableViewpemisah garis ke nol. Anda juga dapat mengubah separatorInsetdari storyboard
KRUKUSA

Jawaban:

220

Ini bekerja untuk saya di iOS 8.4 - 9.0 perangkat menggunakan Xcode 6.4 dan Swift 1.2:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = UITableViewCell()


    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero

    return cell
}

Pembaruan Swift 5:

cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero
MB_iOSDeveloper
sumber
Mengapa ini menghapus meja saya dengan yang kosong? Pemisah dipindahkan tetapi saya tidak dapat melihat tombol saya
Oscar
1
@ James, tolong jelaskan, "hapus meja saya dengan yang kosong?" Bagaimana Anda menambahkan tombol Anda (melalui IB, kode)?
MB_iOSDeveloper
1
Solusi yang sangat bagus Tetapi dalam kasus saya, saya meletakkan kode langsung ke inisialisasi sel, karena saya ingin memiliki lebar penuh pemisah di semua pengontrol.
Vojta
Jika tidak jelas, ini juga berfungsi untuk Objective-C dengan perubahan sintaks yang tepat tentu saja.
cohenadair
1
Tidak satu pun dari solusi ini yang berfungsi pada iPad. Ini hanya berfungsi pada iPhone ...
Charles Robertson
103

Saya mendapat jawaban dari posting ini: iOS 8 UITableView separator inset 0 tidak berfungsi

Cukup tambahkan kode ini di blog Anda UITableViewController

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [self.tableView setSeparatorInset:UIEdgeInsetsZero];
    }

    if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
        [self.tableView setLayoutMargins:UIEdgeInsetsZero];
    }
}
Timo Cengiz
sumber
2
ini berfungsi untuk saya hanya menambahkan metode delegasi tableView
TonyTony
Maaf saya tidak mengerti. Maksud Anda, itu sudah cukup bagi Anda untuk menambahkan TableViewDeleagte ?. Saya hanya mencoba menambahkan bahwa itu tidak berhasil untuk saya @TonyTony
Timo Cengiz
3
bagi saya metode viewDidLayoutSubviewsini tidak perlu
TonyTony
Apakah Anda mencoba menjalankan kode Anda dengan versi iOS selain 8? Mungkin ini bekerja untuk yang terbaru. Kalau tidak baik bagi Anda bahwa itu bekerja. Saya mencoba menambahkan metode delegasi tableview dan itu tidak membantu. @TonyTony
Timo Cengiz
Saya harus menggunakan keduanya. Saya mencoba menggunakan masing-masing secara individual tetapi tidak berhasil. Itu hanya berfungsi ketika saya menggunakan keduanya. Selain itu, saya mencobanya ketika view controller saya adalah subclass dari UITableViewController, dan ketika itu adalah subclass dari UIViewController. Tidak ada perbedaan. Perhatikan bahwa saya menjalankan di simulator 8.1.
Ron
100

Di Anda UITableViewCell

Buka Pemeriksa Atribut di Pembuat Antarmuka Anda dan cukup ubah "15" menjadi 0. Lakukan ini untuk semua sel yang ingin Anda ubah.

instet

Anda mungkin perlu menambahkan [cell setLayoutMargins:UIEdgeInsetsZero];ketableViewCell

HannahCarney
sumber
1
Atau itu aneh. Ini berhasil bagi saya (terima kasih!) Pada baris tempat saya menampilkan UITableViewCell, tetapi pada baris kosong apa pun di bawahnya, separator masih diindentasi oleh 15 piksel.
Mike Gledhill
Jika Anda menggunakan sel statis, yang Anda butuhkan hanyalah mengubah inset kiri menjadi 0 seperti yang dijelaskan dalam gambar (Bekerja di iOS 10, Xcode 8.3.1)
Ignacio Valdivieso
29

untuk Swift 3:

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.separatorInset = .zero
  tableView.layoutMargins = .zero
}
Wilson
sumber
20
  1. Pilih milik Anda UITableViewCell
  2. Pergi ke Atributes Inspector
  3. Buka Pemisah dan ubah ke "Insets khusus"
  4. Set leftdan / atau rightbidang. (Secara default left: 15, right: 0)

Lihat cara kerjanya (menggunakan left: 100):

masukkan deskripsi gambar di sini

Hasil:

masukkan deskripsi gambar di sini

Sebastián Lara
sumber
1
duplikat jawaban sebelumnya dari @Hannah Louisa Carney
Konstantin Salavatov
19

Saya mewarisi dari UITableViewControllerdan perlu tambahan untuk pengaturan dua inset willDisplayCelljuga untuk mengatur preservesSuperviewLayoutMarginske false. Di Swift terlihat seperti ini:

override func tableView(_tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }
}
H6.
sumber
Anda tidak perlu mengatur preservesSuperviewLayoutMargins = falsekarena nilai default sudah salah
crubio
2
Perhatikan bahwa ini tidak akan menyesuaikan pemisah pada sel 'placeholder' yang ditampilkan oleh controller untuk mengisi tampilan di bawah sel Anda jika Anda sel tidak membuat ketinggian penuh.
Tieme
11

Pemisah Insetsecara default 15 dari kiri. Ubah Insetopsi Pemisah dari automenjadi customdan atur inset ke 0.

masukkan deskripsi gambar di sini

Ramin
sumber
9

Untuk Swift di iOS 9+

Jika menggunakan kebiasaan UITableViewCell:

override var layoutMargins: UIEdgeInsets {
    get { return UIEdgeInsetsZero }
    set(newVal) {}
}

maka untuk UITableViewdi Anda viewDidLoad:

self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;
Christopher Larsen
sumber
Ini adalah satu-satunya jawaban yang memperbaikinya bagi saya (diperbarui ke Swift 3). Namun ... itu berfungsi ketika ada data di dalam sel. Untuk sel kosong yang belum diisi (dan saya kira belum menyebut variabel layoutMargins overriden ini) pemisah masih tidak mengisi lebar penuh sel kustom saya di tampilan tabel. Ada ide tentang itu?
RanLearns
Pada iPhone, separator hanya beberapa piksel dari kiri dan beberapa piksel dari kanan pada sel kosong. Itu terlihat baik-baik saja tanpa menggunakan trik ini untuk menghilangkan margin. Di iPad adalah masalah sebenarnya - pemisah pada sel kosong pergi dari tepi kiri tampilan tabel, hanya sekitar 80% dari lebar sel. Ketika ada data di dalam sel, pemisah masih 80% dari lebar sel, tetapi mulai 20% dari jalan masuk dan berjalan sampai ke tepi kanan tampilan
tabel
1
Mencari solusi ... menggunakan jika #available (iOS 9, *) {self.tableView.cellLayoutMarginsFollowReadableWidth = false} membuatnya jadi saya tidak memerlukan kode Anda sama sekali di iPhone. Pemisah hanya berjalan lebar penuh. Di iPad, sel-sel kosong memiliki pemisah lebar penuh, tetapi saya membutuhkan kode Anda untuk menjaga lebar penuh ketika data ditambahkan. Jika tidak, ada beberapa piksel ke kiri yang ditambahkan di mana tidak ada pemisah begitu data mengisi sel.
RanLearns
1
Jawab di mana saya mendapatkan kode dalam komentar di atas dari: stackoverflow.com/a/31538250/428981
RanLearns
9

Untuk orang-orang yang memiliki masalah dengan iPad - ini akan membuat Anda dalam keadaan yang sama dengan iPhone. Anda kemudian dapat menyesuaikan separatorInsetsesuai kebutuhan.

tableView.cellLayoutMarginsFollowReadableWidth = false
Michael Rose
sumber
Ini adalah masalah saya di iOS 10 vs iOS 11. iOS 11 baik-baik saja, tetapi 10 memiliki margin yang berbeda. Terima kasih!!!
migs647
9

Gunakan dalam cellForRowAtIndexPathmetode, untuk mengonfigurasi spesifikasi pemisah sel,
ini berfungsi sempurna untuk iOS9.0 +

 cell.separatorInset = UIEdgeInsetsZero;
 cell.layoutMargins = UIEdgeInsetsZero;
 cell.preservesSuperviewLayoutMargins = NO;
Aks
sumber
8

Diuji untuk iOS 9.3 & Swift 2.2. Pastikan untuk memasukkan kode willDisplayCellyang dipanggil tepat sebelum menampilkan sel dan bukan di cellForRowAtIndexPathtempat Anda membuat sel saja.

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero
}

Tambahkan overrideke fungsi UITableViewController, seperti:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
oyalhi
sumber
5

Tidak ada yang di atas bekerja untuk saya di Swift 2.2 dan Xcode 7.3.1

Ternyata menjadi solusi paling sederhana dari semuanya. Tidak diperlukan kode. Cukup ubah TableViewCellnilai Layout Margin di UITableViewinspektur Anda :

aurawindsurfing
sumber
4

Untuk Swift 3:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
}
Giulio Colleluori
sumber
1

In viewDidLoad(diuji iOS11 - cepat 4.1)

mencoba

tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)

Giang
sumber
0

Tidak satu pun dari solusi ini yang berfungsi pada iPad, tetapi saya telah menemukan solusi yang mencakup kedua perangkat:

Dengan sel yang dapat digunakan kembali:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    ...[other code]...
    [cell setLayoutMargins:UIEdgeInsetsZero];
    [cell setSeparatorInset:UIEdgeInsetsZero];
    return cell;
}

Dengan sel yang tidak dapat digunakan kembali:

- (void)removeSeparatorInset:(UITableView*)tableView{
    NSArray *cells = [tableView visibleCells];
    for (UITableViewCell *cell in cells){
        [cell setLayoutMargins:UIEdgeInsetsZero];
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

-(void) viewDidLayoutSubviews{
   [super viewDidLayoutSubviews];
   [self removeSeparatorInset:self.tableView];
}

Untuk memperluas pendekatan ini:

@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;

Kedua properti dapat digunakan oleh UITableView& UITableViewCell. Yang terakhir adalah, pada kenyataannya, properti dari UIView, yang merupakan kelas induk dari keduanya UITableView& UITableViewCell.

Charles Robertson
sumber
1
Satu-satunya solusi yang dapat saya temukan untuk sel
Mickey
0

cepat 5, Pembaruan Xcode 11

tempatkan ini di dalam viewDidLoad ()

yourTableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

untuk pemisah ujung ke ujung hanya mengatur nilai kiri dan kanan ke 0.

dengan cara mengubah "yourTableView" menjadi nama TableView Outlet Anda.

Pengembang
sumber