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?


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

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];
    }
}

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


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
}

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


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
    }
}

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


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;

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

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;

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) {

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 :


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
    }
}

1

In viewDidLoad(diuji iOS11 - cepat 4.1)

mencoba

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


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.


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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.