Hilangkan pemisah tambahan di bawah UITableView

714

Ketika saya mengatur tampilan tabel dengan 4 baris, masih ada garis pemisah tambahan (atau sel kosong tambahan) di bawah baris yang diisi.

Bagaimana saya menghapus sel-sel ini?

gambar untuk garis pemisah tambahan di UITableView

RoundOutTooSoon
sumber

Jawaban:

1505

Pembuat antarmuka (iOS 9+)

Seret UIView ke meja. Di storyboard, itu akan duduk di bagian atas di bawah sel khusus Anda. Anda mungkin lebih suka menyebutnya "footer".

Ini ditunjukkan dengan warna hijau untuk kejelasan, Anda mungkin ingin warna yang jelas.

Perhatikan bahwa dengan menyesuaikan ketinggian, Anda dapat memengaruhi cara "bouncing bawah" tabel ditangani, seperti yang Anda inginkan. (Tinggi nol biasanya baik-baik saja).

masukkan deskripsi gambar di sini


Untuk melakukannya secara terprogram:

Cepat

override func viewDidLoad() {
    super.viewDidLoad()
    self.tableView.tableFooterView = UIView()
}

Objektif-C

iOS 6.1+

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // This will remove extra separators from tableview
    self.tableView.tableFooterView = [UIView new];
}

atau jika Anda lebih suka,

    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

Secara historis di iOS:

Tambahkan ke pengontrol tampilan tabel ...

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
     // This will create a "invisible" footer
     return CGFLOAT_MIN;
 }

dan jika perlu ...

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{        
    return [UIView new];

    // If you are not using ARC:
    // return [[UIView new] autorelease];
}
J. Costa
sumber
Saya pikir deskripsi dan kode Anda terbalik. Bagaimanapun, ini bekerja baik untuk saya. Saya hanya menggunakan footer "nyata" dengan tabel yang dikelompokkan, jadi saya menambahkan if (tableView.style! = UITableViewStyleGrouped) {} ​​di sekitar kode Anda. Sekarang semua tabel saya yang tidak dikelompokkan kehilangan sel ekstra mereka, sementara tabel saya yang dikelompokkan tidak terpengaruh.
arlomedia
Mengikuti catatan saya di atas, saya akan menambahkan peringatan bahwa jika Anda memasukkan kondisi apa pun ke dalam metode viewForFooterInSection, pastikan metode tersebut mengembalikan UIView atau nil. Jika Anda secara tidak sengaja mengembalikan batal, aplikasi Anda akan macet!
arlomedia
4
@Mathieu Ini akan berfungsi karena jika tabel memiliki footer khusus, itu tidak akan membuat baris "fantom" untuk mengisi tampilan tabel. Jadi di dalam Anda akan membuat tampilan kosong untuk digunakan sebagai footer dan mengatur ketinggian ke dekat 0 (tidak mungkin nol atau iOS tidak akan membuatnya). Dengan trik sederhana ini Anda akan mengubah perilaku default.
J. Costa
2
@ j.Costa: Solusi Anda hanya akan berfungsi sekali saat uitableview dibuat. setelah klik pada sel terakhir solusi Anda tidak lebih baik. tolong tingkatkan jawaban Anda.
3
Menggunakan tableFooterViewdaun pemisah pada sel terakhir di baris, karena tabel masih mengantisipasi konten di bawah sel itu. Menggunakan cara historis akan menghilangkan pemisah terakhir dan terlihat lebih baik secara keseluruhan.
James Kuang
128

Berikut cara lain untuk melakukannya tanpa menggunakan gaya tabel yang dikelompokkan, dan yang mungkin tidak Anda duga. Menambahkan header dan footer ke tabel (mungkin satu atau yang lain sudah cukup, belum diperiksa) menyebabkan pemisah menghilang dari baris pengisi / kosong.

Saya menemukan ini karena saya ingin sedikit ruang di bagian atas dan bawah meja untuk mengurangi risiko menekan tombol daripada sel meja dengan jari gemuk. Berikut adalah metode untuk menempel tampilan kosong sebagai header dan footer. Gunakan ketinggian apa pun yang Anda suka, Anda masih menghilangkan garis pemisah ekstra.

- (void) addHeaderAndFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.myTableView setTableHeaderView:v];
    [self.myTableView setTableFooterView:v];
    [v release];
}

Menanggapi @Casebash, saya kembali ke kode di aplikasi saya ("AcmeLists" List Manager di iTunes store ...) dan memotong pendek metode addHeaderAndFooter untuk memverifikasi. Tanpa itu , saya memiliki pemisah baris tambahan; dengan kode, saya memiliki apa yang Anda lihat di jepretan jendela ini: tidak ada gambar pemisah baris tabel . Jadi saya tidak yakin mengapa itu tidak berhasil untuk Anda. Selain itu, masuk akal bagi saya bahwa memiliki footer kustom pada tampilan tabel tentu harus berhenti menggambar pemisah baris untuk baris kosong di bawahnya. Itu akan mengerikan. Sebagai referensi, saya melihat tabel di mana ada lebih banyak baris daripada yang bisa dilihat di layar, dan kemudian untuk tabel dengan dua baris. Dalam kedua kasus, tidak ada pemisah asing.

Mungkin tampilan khusus Anda sebenarnya tidak ditambahkan. Untuk memeriksa itu, atur warna latar belakang ke sesuatu selain clearColor, misalnya [UIColor redColor],. Jika Anda tidak melihat beberapa bilah merah di bagian bawah tabel, footer Anda tidak disetel.

wkw
sumber
1
Anda dapat melakukan ini di IB, juga. Cukup seret UIView di bagian bawah TableView dan atur ketinggian ke 1.
Ortwin Gentz
70

Menghapus garis pemisah tambahan untuk baris kosong di UITableView di Swift

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTableview.tableFooterView = UIView()
}
dineshthamburu
sumber
34

Saya ingin menyampaikan jawaban wkw :

Cukup menambahkan hanya footer dengan tinggi 0 akan melakukan trik. (diuji pada SDK 4.2, 4.4.1)

- (void) addFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectZero];

    [self.myTableView setTableFooterView:v];
}

atau bahkan lebih sederhana - tempat Anda mengatur tampilan tabel, tambahkan baris ini:

//change height value if extra space is needed at the bottom.
[_tableView setTableFooterView:[[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)]];

atau bahkan lebih sederhana - untuk menghapus pemisah apa pun:

[_tableView setTableFooterView:[UIView new]];

Terima kasih untuk wkw lagi :)

Guntis Treulands
sumber
Ini adalah jawaban yang tepat, karena dalam metode lain baris terakhir tetap tanpa pemisah baris
Ankush
22

Untuk iOS 7+ menggunakan Storyboards

Cukup seret UIViewke dalam Anda UITableViewsebagai footer. Atur tinggi tampilan footer ke 0.

Kyle Clegg
sumber
18

Coba ini. Ini bekerja untuk saya:

- (void) viewDidLoad
{
  [super viewDidLoad];

  // Without ARC
  //self.tableView.tableFooterView = [[[UIView alloc] init] autorelease];

  // With ARC, tried on Xcode 5
  self.tableView.tableFooterView = [UIView new];
}
Ambili B Menon
sumber
14

Untuk Swift:

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.tableFooterView = UIView()
    }
Sebastian
sumber
11

Jika Anda menggunakan Swift, tambahkan kode berikut untuk viewDidLoad dari pengontrol yang mengelola tampilan tabel:

override func viewDidLoad() {
    super.viewDidLoad()

    //...

    // Remove extra separators
    tableView.tableFooterView = UIView()
}
Babatunde Adeyemi
sumber
8

Anda bisa menambahkan footer kosong di bagian akhir kemudian akan menyembunyikan sel-sel yang kosong tetapi juga akan terlihat sangat jelek:

tableView.tableFooterView = UIView()

masukkan deskripsi gambar di sini

Ada pendekatan yang lebih baik: tambahkan garis 1 titik di akhir tampilan tabel karena footer dan sel-sel kosong juga tidak akan ditampilkan lagi.

let footerView = UIView()
footerView.frame = CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1)
footerView.backgroundColor = tableView.separatorColor
tableView.tableFooterView = footerView

masukkan deskripsi gambar di sini

Darko
sumber
Masukan yang sangat bagus, namun tidak perlu membuat sel terakhir Anda dengan warna pemisah tebal di bagian bawah, alih-alih hanya membuatnya menjadi warna latar sel yang sama dan juga menghilang.
Gustavo Baiocchi Costa
Namun Anda lebih suka. Tapi saya pikir pemisah yang agak "tidak selesai" terlihat sangat jelek.
Darko
7

cukup tambahkan kode ini ( Swift ). .

tableView.tableFooterView = UIView()
Roy
sumber
1
Duplikat dari banyak jawaban, termasuk jawaban wiki teratas dan jawaban Sebastian
Cœur
7

Memajukan solusi J. Costa: Anda dapat membuat perubahan global ke tabel dengan meletakkan baris kode ini:

[[UITableView appearance] setTableFooterView:[[UIView alloc] initWithFrame:CGRectZero]];

di dalam metode pertama yang mungkin (biasanya di AppDelegate, dalam: application:didFinishLaunchingWithOptions:metode).

o.shnn
sumber
2
Hati-hati dengan yang satu ini, ada beberapa kasus di mana footer yang Anda inginkan dapat diganti dan Anda akan menghabiskan satu atau dua hari untuk mempertanyakan kewarasan Anda. Selain itu, tableFooterView tidak ditandai dengan UI_APPEARANCE_SELECTOR sehingga perilaku aktual dapat berubah kapan saja.
mwright
6

Saya tahu pertanyaan ini telah diterima tetapi saya menempatkan di sini cara yang berbeda untuk menyembunyikan garis pemisah ekstra UITableView .

Anda dapat menyembunyikan tableViewgaris pemisah standar, dan menambahkan garis kustom di bagian atas setiap sel.

Memperbarui:

Cara termudah untuk menambahkan pemisah khusus adalah dengan menambahkan sederhana dengan UIViewtinggi 1px:

UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1)];
separatorLineView.backgroundColor = [UIColor grayColor]; /// may be here is clearColor;
[cell.contentView addSubview:separatorLineView];

ATAU

    self.tblView=[[UITableView alloc] initWithFrame:CGRectMake(0,0,320,370) style:UITableViewStylePlain];
    self.tblView.delegate=self;
    self.tblView.dataSource=self;
    [self.view addSubview:self.tblView];

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.tblView setTableHeaderView:v];
    [self.tblView setTableFooterView:v];
    [v release];

ATAU

- (float)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    // This will create a "invisible" footer
    return 0.01f;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    // To "clear" the footer view
    return [[UIView new] autorelease];
}

ATAU Cara terbaik dan sederhana yang saya suka adalah

self.tableView.tableFooterView = [[UIView alloc] init];

Coba yang mana saja;

iPatel
sumber
6

Anda mungkin menemukan banyak jawaban untuk pertanyaan ini. Sebagian besar dari mereka di sekitar manipulasi dengan UITableView's tableFooterViewatribut dan ini adalah cara yang tepat untuk menyembunyikan baris kosong. Untuk penyelenggaraan, saya telah membuat ekstensi sederhana yang memungkinkan untuk menghidupkan / mematikan baris kosong dari Interface Builder. Anda dapat memeriksanya dari file inti ini . Saya harap ini bisa menghemat sedikit waktu Anda.

extension UITableView {

  @IBInspectable
  var isEmptyRowsHidden: Bool {
        get {
          return tableFooterView != nil
        }
        set {
          if newValue {
              tableFooterView = UIView(frame: .zero)
          } else {
              tableFooterView = nil
          }
       }
    }
}

Pemakaian:

tableView.isEmptyRowsHidden = true

masukkan deskripsi gambar di sini

Stanislau Baranouski
sumber
5

uitableview sembunyikan garis pemisah ekstra sembunyikan garis pemisah tambahan di swift 3.0

 self.tbltableView.tableFooterView = UIView(frame: .zero)
Parth Changela
sumber
5

Jika Anda tidak ingin pemisah setelah sel terakhir, maka Anda membutuhkan tinggi mendekati nol tetapi tidak nol untuk footer Anda.

Di Anda UITableViewDelegate:

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}
Cur
sumber
1
hebat! Bekerja untukku !!
Antony Raphel
5

Swift bekerja sangat baik dengan:

tableView.tableFooterView = UIView()
Marcelo Gracietti
sumber
3

Tambahkan saja tampilan dengan warna pemisah yang diinginkan sebagai warna latar, lebar 100%, tinggi 1px pada posisi x0 y-1 ke tableViewCell Anda. Pastikan tableViewCell tidak memotong subview, sebaliknya tableView seharusnya.

Jadi, Anda mendapatkan pemisah absolut yang sederhana dan berfungsi hanya antara sel yang ada tanpa per kode atau IB.

Catatan: Pada pantulan vertikal, separator pertama muncul, tetapi itu seharusnya tidak menjadi masalah karena itu adalah perilaku iOS default.

maaalex
sumber
3

Saya menggunakan tampilan tabel untuk menunjukkan jumlah tetap baris tinggi tetap, jadi saya cukup mengubah ukurannya dan membuatnya tidak dapat digulir.

Casebash
sumber
3

Untuk menghilangkan garis pemisah tambahan dari bagian bawah UItableview secara terprogram, cukup tulis dua baris kode berikut dan itu akan menghapus pemisah tambahan dari itu.

tableView.sectionFooterHeight = 0.f;
tableView.sectionHeaderHeight = 0.f;

Trik ini bekerja untuk saya sepanjang waktu, coba sendiri.

Kalpesh Panchasara
sumber
2

Saya beruntung menerapkan sepotong jawaban yang diterima (iOS 9+, Swift 2.2). Saya telah mencoba menerapkan:

self.tableView.tableFooterView = UIView(frame: .zero)

Namun, tidak ada efek pada saya tableView- saya percaya itu mungkin ada hubungannya dengan fakta yang saya gunakan UITableViewController.

Sebaliknya, saya hanya perlu mengganti viewForFooterInSectionmetode (saya tidak mengatur yang tableFooterViewlain):

override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    return UIView(frame: .zero)
}

Ini bekerja dengan baik untuk tableViewdengan satu bagian (jika Anda memiliki beberapa bagian, Anda perlu menentukan yang terakhir).

BAP
sumber
2

Jika Anda hanya memiliki satu bagian, maka cara tercepat dan termudah adalah dengan mengatur Gaya Tampilan Tabel dari "Biasa" ke "Dikelompokkan". (lihat gambar)

TableView Dikelompokkan

Jika Anda memiliki lebih banyak bagian, Anda mungkin perlu mengatur tinggi tajuk menjadi nol (tergantung selera Anda / pelanggan Anda / manajer proyek Anda)

Jika Anda memiliki lebih banyak bagian, dan tidak ingin mengacaukan header (bahkan jika itu hanya satu baris dalam kasus paling sederhana), maka Anda perlu menetapkan UIView sebagai footer, seperti yang dijelaskan dalam jawaban sebelumnya)

Ikan Gefilte
sumber
2

Ekstensi Swift 4.0

Hanya sedikit ekstensi untuk storyboard:

masukkan deskripsi gambar di sini

extension UITableView {
    @IBInspectable
    var hideSeparatorForEmptyCells: Bool {
        set {
            tableFooterView = newValue ? UIView() : nil
        }
        get {
            return tableFooterView == nil
        }
    }
}
Nik Kov
sumber
2

Cepat dan mudah 4 cara Swift.

override func viewDidLoad() {
     tableView.tableFooterView = UIView(frame: .zero)
}

Jika Anda memiliki sel statis. Anda juga dapat mematikan pemisah dari jendela Inspektur. (ini tidak akan diinginkan jika Anda membutuhkan pemisah. Dalam hal ini gunakan metode yang ditunjukkan di atas) jendela inspektur

Alix
sumber
Mengatur UIView baru ke tableFooterView sudah dijawab 10 kali, dengan penjelasan yang lebih baik tentang alasannya, kode yang lebih baik (Anda hilang super.viewDidLoad()) dan termasuk dalam jawaban wiki di atas. Sedangkan untuk menghapus semua pemisah, itu sebenarnya bukan tentang pertanyaan ini, jadi lebih baik kembalikan edit terakhir Anda dan / atau hapus jawaban Anda sepenuhnya.
Cœur
1

Jika Anda ingin menghapus ruang yang tidak diinginkan di UITableview, Anda dapat menggunakan dua metode berikut

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 0.1;
}
Hari c
sumber
1

Saya telah menambahkan ekstensi tampilan tabel kecil ini yang membantu seluruh

extension UITableView {
     func removeExtraCells() {
         tableFooterView = UIView(frame: .zero)
     }
}
Suresh Varma
sumber
1

Coba dengan ini

untuk Tujuan C

- (void)viewDidLoad 
 {
  [super viewDidLoad];
  // This will remove extra separators from tableview
  self.yourTableView.tableFooterView = [UIView new];
}

untuk Swift

override func viewDidLoad() {
 super.viewDidLoad()
 self.yourTableView.tableFooterView = UIView()
}
Atanu Mondal
sumber
0

Coba ini

self.tables.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];
Wisnu
sumber
0

UIKittidak membuat sel kosong ketika tableViewmemiliki tableFooterView. Jadi kita bisa membuat trik dan menetapkan UIViewobjek tinggi nol sebagai catatan kaki tableView.

tableView.tableFooterView = UIView()
iMuzahid
sumber
0

Jika Anda memiliki searchbardi view(untuk membatasi jumlah hasil misalnya), Anda juga harus menambahkan berikut ini dalam shouldReloadTableForSearchStringdanshouldReloadTableForSearchScope:

controller.searchResultsTable.footerView = [ [ UIView alloc ] initWithFrame:CGRectZero ];
pengguna3900346
sumber
0

Dalam Swift (saya menggunakan 4.0), Anda dapat melakukannya dengan menciptakan kustom UITableViewCellkelas, dan overridingyang setSelectedmetode. Lalu separator insetssemuanya ke 0 . (kelas utama saya dengan tampilan tabel memiliki latar belakang yang jelas) warna.

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // eliminate extra separators below UITableView
    self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
hoptown
sumber