Pertanyaan UITableView: cara yang tepat untuk menampilkan pemisah untuk sel terakhir


Pertanyaannya adalah apa cara paling tepat untuk menampilkan pemisah di sel terakhir dalam tabel / bagian.

Pada dasarnya inilah yang saya cari.

enter image description here Ini dari aplikasi musik asli, yang membuat saya berpikir bahwa itu harus mungkin dicapai hanya dengan cara UITableView, mereka tidak akan menggunakan beberapa API pribadi untuk pemisah sel, kan?

Saya tahu Anda bisa lolos tanpa menggunakan pemisah sebenarnya, tetapi menambahkan satu garis piksel di bagian bawah sel. Tapi saya bukan penggemar pendekatan ini karena

  1. Ketika sel dipilih / disorot -nya pemisah dan pemisah dari sel sebelumnya disembunyikan secara otomatis (lihat tangkapan layar kedua dengan "Anda harus gila" dipilih). Dan ini adalah sesuatu yang saya ingin UITableView untuk menangani alih-alih melakukan sendiri jika saya menggunakan garis satu-pixel (yang sangat berguna ketika pemisah sel tidak memperpanjang semua jalan ke tepi tampilan tabel, pemisah dan latar sel yang dipilih tidak terlihat bagus bersama).
  2. Saya ingin menjaga sel saya serata mungkin untuk menggulirkan kinerja.

Juga ada sesuatu dalam referensi UITableView yang membuat saya berpikir bahwa ada cara mudah untuk mendapatkan apa yang saya inginkan:

Di iOS 7 dan yang lebih baru, pemisah sel tidak meluas sampai ke   tepi tampilan tabel. Properti ini menetapkan inset default untuk semua   sel dalam tabel, seperti rowHeight menetapkan tinggi default untuk   sel. Ini juga digunakan untuk mengelola pemisah "ekstra" yang ditarik   bagian bawah tabel gaya polos.

Apakah ada yang tahu bagaimana tepatnya menggunakan pemisah "ekstra" ini yang digambar di bagian bawah tabel gaya biasa? Karena inilah yang saya butuhkan. Saya pikir menugaskan separatorInsetke UITableViewtidak UITableViewCell akan melakukan trik, tetapi tidak, sel terakhir masih hilang pemisahnya.

Saat ini saya hanya melihat satu opsi: untuk memiliki footer bagian kustom untuk meniru pemisah untuk sel terakhir. Dan ini tidak baik, terutama jika Anda ingin menggunakan footer bagian yang sebenarnya tableView:titleForFooterInSection: metode.


29
2017-11-04 12:14


asal


Jawaban:


Ini bekerja dengan sempurna bagi saya untuk menambahkan pemisah ke sel terakhir. Selamat bersenang-senang!

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

15
2018-03-26 10:46



Saya baru saja menemukan sesuatu yang bekerja untuk saya. Dalam beberapa kata: berikan UITableView Anda tableFooterView dan atur tinggi frame-nya menjadi 0. Ini membuat pemisah aktual, dengan insets yang benar.

Dalam detail lebih lanjut: jika Anda menggunakan storyboard, seret UIView ke bagian bawah Table View Anda (pada tampilan struktur pohon di sebelah kiri) sehingga ditampilkan tepat di bawah Table View Cell, pada level hierarkis yang sama. Ini membuat tableFooterView. Tentu saja ini bisa dilakukan secara terprogram juga.

Kemudian, dalam implementasi UITableViewController Anda:

UIView *footerView = self.tableView.tableFooterView;
CGRect footerFrame = footerView.frame;
footerFrame.size.height = 0;
[footerView setFrame:footerFrame];

Beri tahu saya jika itu berhasil untuk Anda! Mungkin juga bekerja untuk pemisah pertama jika Anda menggunakan tableHeaderView sebagai gantinya, saya belum mencobanya.


7
2017-08-27 16:43



ini akan melakukan apa yang Anda inginkan .. meskipun garis akan mengambil seluruh lebar sel:

di - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
self.tableView.separatorColor = [UIColor redColor];
self.tableView.separatorInset = UIEdgeInsetsZero;

2
2017-11-04 13:55



Saya memiliki masalah serupa dan menemukan solusi. Apple menyembunyikan pemisah uitableviewcell terakhir dan kemudian menampilkannya jika Anda memilih sel atau jika Anda memanggil pilih dan batalkan pilihan pada sel itu.

Jadi saya mengajarkan yang terbaik - (void)layoutSubviews. Tampilan pemisah disebut _separatorView dan itu milik pribadi. Dengan menggunakan negara yang dipilih / disorot sel Anda dapat membuat sesuatu seperti ini:

- (void)layoutSubviews
{
    // Call super so the OS can do it's layout first
    [super layoutSubviews];

    // Get the separator view
    UIView *separatorView = [self valueForKey:@"_separatorView"];
    // Make the custom inset
    CGRect newFrame = CGRectMake(0.0, 0.0, self.bounds.size.width, separatorView.frame.size.height);
    newFrame = CGRectInset(newFrame, 15.0, 0.0);
    [separatorView setFrame:newFrame];

    // Show or hide the bar based on cell state        
    if (!self.selected) {
        separatorView.hidden = NO;
    }
    if (self.isHighlighted) {
        separatorView.hidden = YES;
    }
}

Sesuatu seperti ini.


2
2018-03-27 15:51



Anda dapat melakukan sesuatu seperti ini jika Anda tidak menggunakan bagian:

- (void)viewDidLoad
{
     self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(insetLeftSide, 0, width - insetRightSide, 1)];
}

Jika Anda menggunakan bagian mengimplementasikan footer di setiap bagian sebagai satu titik Lihat dalam metode

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
}

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
}

Ini akan memungkinkan Anda memiliki pemisah untuk sel terakhir Anda yang notabene bukan pemisah adalah footer yang dapat Anda mainkan dan membuatnya terlihat seperti pemisah.


2
2018-03-28 15:46



Di iOS 8, jika Anda memiliki gaya sederhana UITableView, dan menambahkan footer, pemisah terakhir hilang. Namun, Anda dapat dengan mudah membuat ulang dengan menambahkan tampilan pemisah khusus ke footer.

Contoh ini persis meniru gaya pemisah Widget Hari Ini

    override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {

        //create footer view
        let result = UIView()
        result.frame.size.height = tableView.rowHeight

        //recreate last cell separator, which gets hidden by footer
        let sepFrame = CGRectMake(15, -0.5, tableView.frame.width, 0.5);
        let vibrancyEffectView = UIVisualEffectView.init(effect: UIVibrancyEffect.notificationCenterVibrancyEffect())
        vibrancyEffectView.frame = sepFrame
        vibrancyEffectView.contentView.backgroundColor = tableView.separatorColor
        result.addSubview(vibrancyEffectView)
        return result
}

1
2017-11-13 21:01



Jika Anda menambahkan footer kosong maka tampilan tabel akan menghapus semua pemisah baris yang tersisa (untuk sel yang tidak ada) tetapi masih akan menyertakan pemisah untuk sel terakhir:

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

1
2018-01-10 21:31



Saat Anda menambahkan headerView atau footerView ke TableView Anda, garis pemisah terakhir akan hilang.

Contoh di bawah ini akan membiarkan Anda membuat solusi untuk menampilkan pemisah pada sel terakhir. Satu-satunya hal yang harus Anda terapkan lebih banyak adalah membuat pemisah ini menghilang setelah memilih sel, sehingga perilaku adalah sama seperti di sel-sel lainnya.

Untuk Swift 4,0

func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {

    let result = UIView()

    // recreate insets from existing ones in the table view
    let insets = tableView.separatorInset
    let width = tableView.bounds.width - insets.left - insets.right
    let sepFrame = CGRect(x: insets.left, y: -0.5, width: width, height: 0.5)

    // create layer with separator, setting color
    let sep = CALayer()
    sep.frame = sepFrame
    sep.backgroundColor = tableView.separatorColor?.cgColor
    result.layer.addSublayer(sep)

    return result
}

1
2018-01-31 22:14



Jadi, inilah solusi super sederhana di Swift 4 yang berfungsi:

Dalam override func viewDidLoad(){}, Saya hanya menerapkan baris kode ini:

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

Oleh karena itu memastikan bahwa hanya sel terakhir yang mendapatkan inset pemisah.

Ini bekerja dengan sempurna untuk saya, semoga ini juga berlaku untuk Anda!


1
2018-05-15 16:10



Bekerja di iOS 7.x dan 8.x (taruh di cellForRowAtIndexPath):

(PS pengganti "elemen max dari sumber data Anda" dengan jumlah data sumber array Anda)

 if (row == <max elements of your datasource>-1) {
     UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.contentView.frame.size.height-1, self.view.frame.size.width, 1)];/// change size as you need.
     separatorLineView.tag = 666;
     separatorLineView.backgroundColor = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];
     UIView *separator = [cell.contentView viewWithTag:666];
     // case of orientation changed..
     if (separator.frame.size.width != cell.contentView.frame.size.width) {
        [[cell.contentView viewWithTag:666] removeFromSuperview];
        separator = nil;
     }
     if (separator==nil) [cell.contentView addSubview:separatorLineView];
 }

0
2018-03-28 08:40



Ini jelas membantu. Kerja. tetapi tetapkan pemisah "tidak ada" dari inspektur atribut. Tuliskan kode berikut di cellForRowAtIndexPath  metode

if(indexPath.row==arrData.count-1){
 UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0,           
 cell.contentView.frame.size.height - 1.0,      
 cell.contentView.frame.size.width, 1)];

    lineView.backgroundColor = [UIColor blackColor];
    [cell.contentView addSubview:lineView];
}

0
2017-10-14 10:51