Sembunyikan garis pemisah pada satu UITableViewCell

250

Saya menyesuaikan a UITableView. Saya ingin menyembunyikan garis yang memisahkan pada yang terakhir sel ... bisakah saya melakukan ini?

Saya tahu saya bisa melakukan tableView.separatorStyle = UITableViewCellStyle.Nonetetapi itu akan mempengaruhi semua sel dari tableView. Saya ingin itu hanya mempengaruhi sel terakhir saya.

Safari
sumber
Pertanyaan Anda menjawab pertanyaan saya. tableView.separatorStyle = UITableViewCellStyle.None adalah baris yang saya butuhkan
Malachi Holden

Jawaban:

371

di viewDidLoad, tambahkan baris ini:

self.tableView.separatorColor = [UIColor clearColor];

dan di cellForRowAtIndexPath:

untuk iOS versi yang lebih rendah

if(indexPath.row != self.newCarArray.count-1){
    UIImageView *line = [[UIImageView alloc] initWithFrame:CGRectMake(0, 44, 320, 2)];
    line.backgroundColor = [UIColor redColor];
    [cell addSubview:line];
}

untuk iOS 7 versi atas (termasuk iOS 8)

if (indexPath.row == self.newCarArray.count-1) {
    cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}
Hiren
sumber
4
Ini akan bekerja pada iOS7 dan iOS8. Ini secara efektif meremas pemisah ke nol. cell.separatorInset = UIEdgeInsetsMake (0, CGRectGetWidth (cell.bounds) /2.0, 0, CGRectGetWidth (cell.bounds) /2.0)
Harris
9
Satu pengingat: Ketika iDevice Anda adalah iPad dan sel digunakan AutoLayout, nilai yang dikembalikan oleh "cell.bounds.size.width" mungkin tidak sama dengan lebar sel yang sebenarnya. Jadi saya selalu menggunakan "tableView.frame.size.width" bukan "cell.bounds.size.width".
Veight Zhou
5
Harap dicatat: Anda harus menggunakan [cell.contentView addSubview:line]sebagai ganti[cell addSubview:line]
Anastasia
6
ubah inset kiri sel.separatorInset juga akan mengubah inset kiri isi sel. Bukan hanya garis pemisah. Dari apple doc: "Anda dapat menggunakan properti ini untuk menambahkan ruang antara konten sel saat ini dan tepi kiri dan kanan tabel. Nilai inset positif memindahkan konten sel dan pemisah sel ke dalam dan menjauh dari tepi tabel."
zgjie
9
Ide buruk. Anda tidak boleh menambahkan subview ke sel di cellForRowAtIndexPath. Ingatlah bahwa sel digunakan kembali. Setiap kali sel ini digunakan kembali, Anda akan menambahkan tampilan garis pemisah lainnya. Pada daftar besar ini dapat mempengaruhi kinerja gulir. Dan itu bukan cara yang tepat untuk melakukannya.
Dave Batton
247

Anda dapat menggunakan kode berikut:

Cepat:

if indexPath.row == {your row number} {
    cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)
}

atau :

cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, UIScreen.main.bounds.width)

untuk Margin default:

cell.separatorInset = UIEdgeInsetsMake(0, tCell.layoutMargins.left, 0, 0)

untuk menunjukkan pemisah ujung ke ujung

cell.separatorInset = .zero

Tujuan-C:

if (indexPath.row == {your row number}) {
    cell.separatorInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, CGFLOAT_MAX);
}
Avinash
sumber
Tidak berfungsi untuk yang dikelompokkan UITableView, sedangkan jawaban yang diterima berlaku.
Aleks N.
3
Ini tidak berfungsi untuk iOS9, self.tableView.separatorColor = [UIColor clearColor];perbaiki.
Ben
1
Ini peretasan lengkap tetapi yang berfungsi di iOS 9 adalah: cell.layoutMargins = UIEdgeInsetsZero; cell.separatorInset = UIEdgeInsetsMake (0, 0, 0, 9999)
Pat Niemeyer
Ini adalah cara kerjanya untuk saya di iOS 8+: cell.separatorInset = UIEdgeInsetsMake(0.f, 0.f, 0.f, cell.bounds.size.width-cell.layoutMargins.left);Jika saya tidak mengurangi nilai cell.layoutMargins.left, garis pemisah diambil dari perbatasan kiri ke margin kiri (jika Anda punya).
Alexandre OS
3
Ini mendorong semua textLabellayar mati.
aehlke
99

Untuk menindaklanjuti jawaban Hiren .

di ViewDidLoad dan baris berikut:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

Atau, jika Anda menggunakan XIB atau Storyboards, ubah " separator " menjadi " none ":

Pembuat antarmuka

Dan di CellForRowAtIndexPath tambahkan ini:

CGFloat separatorInset; // Separator x position 
CGFloat separatorHeight; 
CGFloat separatorWidth; 
CGFloat separatorY; 
UIImageView *separator;
UIColor *separatorBGColor;

separatorY      = cell.frame.size.height;
separatorHeight = (1.0 / [UIScreen mainScreen].scale);  // This assures you to have a 1px line height whatever the screen resolution
separatorWidth  = cell.frame.size.width;
separatorInset  = 15.0f;
separatorBGColor  = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];

separator = [[UIImageView alloc] initWithFrame:CGRectMake(separatorInset, separatorY, separatorWidth,separatorHeight)];
separator.backgroundColor = separatorBGColor;
[cell addSubView: separator];

Berikut adalah contoh hasil di mana saya menampilkan tampilan tabel dengan Sel dinamis (tetapi hanya memiliki satu dengan konten). Hasilnya adalah bahwa hanya satu yang memiliki separator dan tidak semua tampilan tabel yang "dummy" secara otomatis ditambahkan untuk mengisi layar.

masukkan deskripsi gambar di sini

Semoga ini membantu.

EDIT: Bagi mereka yang tidak selalu membaca komentar, sebenarnya ada cara yang lebih baik untuk melakukannya dengan beberapa baris kode:

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.tableFooterView = UIView()
}
Benjamin
sumber
Saya pikir, untuk menyembunyikan garis pemisah, ini adalah pendekatan yang tepat. self.tableView.separatorStyle = .none
arango_86
52

Jika Anda tidak ingin menggambar pemisah sendiri, gunakan ini:

  // Hide the cell separator by moving it to the far right
  cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

API ini hanya tersedia mulai dari iOS 7 sekalipun.

Kemenaran
sumber
8
separatorInsettampaknya memasukkan isi sel serta pemisah, membutuhkan hack lain untuk mengimbangi:cell.IndentationWidth = -10000;
crishoj
23
Metode yang lebih baik adalah mengatur separatorInsetke 0 untuk atas, kiri dan bawah dan lebar sel untuk kanan: cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, cell.bounds.size.width); Ini menghindari perlu menyesuaikan properti sel lainnya.
bryguy1300
Jika Anda menggunakan lebar batas sel untuk inset, Anda mungkin perlu menghitung ulang saat antarmuka diputar.
AndrewR
Perhatikan bahwa jika sel yang Anda lakukan ini digunakan kembali untuk menggambar sel lain yang Anda tidak ingin sembunyikan pemisah, pemisah itu juga akan hilang darinya.
Michael Peterson
1
UIEdgeInsetsMake (0, 10000, 0, 0); bekerja -> UIEdgeInsetsMake (0, 0, 0, cell.bounds.size.width); tidak. kira itu sebabnya saya memiliki kebiasaan buruk menjaga vcs berukuran 3,5 "dalam xibs dan papan gaya yang artefak pada perangkat 4" + menyebabkan 375-320px bagian = sisa 55px. (dengan suara yoda) dan sangat jelek!
Anton Tropashko
29

lingkungan saya berkembang

  • Xcode 7.0
  • 7A220 Swift 2.0
  • iOS 9.0

jawaban di atas tidak sepenuhnya bekerja untuk saya

setelah mencoba, solusi saya yang akhirnya berhasil adalah:

let indent_large_enought_to_hidden:CGFloat = 10000
cell.separatorInset = UIEdgeInsetsMake(0, indent_large_enought_to_hidden, 0, 0) // indent large engough for separator(including cell' content) to hidden separator
cell.indentationWidth = indent_large_enought_to_hidden * -1 // adjust the cell's content to show normally
cell.indentationLevel = 1 // must add this, otherwise default is 0, now actual indentation = indentationWidth * indentationLevel = 10000 * 1 = -10000

dan efeknya adalah: masukkan deskripsi gambar di sini

crifan
sumber
20

Atur separatorInset.right = .greatestFiniteMagnitudedi sel Anda.

Matius Korporaal
sumber
awakeFromNibapplicationDidBecomeActive
mengaktifkan
Ini berfungsi iOS 12.2, di perangkat, dari pembuatan UITableViewCell terprogram. Bagus.
Womble
Pengaturan pemisah yang tepat bekerja untuk saya ketika saya mengaturnya di cellForRowAt. Solusi terbaik. Ini berfungsi dari iOS 10 hingga 13 untuk saya. Diuji pada iOS 10, 12 dan 13. Ketika margin kiri diatur maka tidak berfungsi untuk iOS 10.
Ariel Bogdziewicz
18

Di Swift 3, Swift 4 dan Swift 5 , Anda dapat menulis ekstensi ke UITableViewCell seperti ini:

extension UITableViewCell {
  func separator(hide: Bool) {
    separatorInset.left = hide ? bounds.size.width : 0
  }
}

Maka Anda dapat menggunakan ini seperti di bawah ini (ketika sel adalah instance sel Anda):

cell.separator(hide: false) // Shows separator 
cell.separator(hide: true) // Hides separator

Ini benar-benar lebih baik menetapkan lebar sel tampilan tabel sebagai inset kiri daripada menetapkan beberapa nomor acak. Karena dalam beberapa dimensi layar, mungkin bukan sekarang tetapi di masa depan pemisah Anda masih dapat terlihat karena angka acak itu mungkin tidak cukup. Selain itu, di iPad dalam mode lansekap Anda tidak dapat menjamin bahwa pemisah Anda akan selalu tidak terlihat.

Okhan Okbay
sumber
Ini tidak berfungsi untuk UITableView gaya berkelompok. Apakah Anda punya solusi untuk kasus yang dikelompokkan?
zslavman
8

Solusi yang lebih baik untuk iOS 7 & 8

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    DLog(@"");
    if (cell && indexPath.row == 0 && indexPath.section == 0) {

        DLog(@"cell.bounds.size.width %f", cell.bounds.size.width);
        cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.0f);
    }
}

Jika aplikasi Anda dapat diputar - gunakan 3000.0f untuk konstanta inset kiri atau hitung dengan cepat. Jika Anda mencoba mengatur inset kanan, Anda memiliki bagian pemisah yang terlihat di sisi kiri sel pada iOS 8.

Sound Blaster
sumber
1
Mengapa menggunakan angka acak ketika Anda bisa melakukan sesuatu seperti ini: MAX ([[layar utama UIScreen] terikat] .size.width, [[UIScreen mainScreen] terikat] .size.height); untuk memastikan selalu hilang
Daniel Galasko
7

Di iOS 7, pemisah sel gaya yang dikelompokkan UITableView terlihat sedikit berbeda. Ini terlihat seperti ini:

masukkan deskripsi gambar di sini

Saya mencoba jawaban Kemenaran untuk melakukan ini:

cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

Namun sepertinya itu tidak berhasil untuk saya. Saya tidak yakin mengapa. Jadi saya memutuskan untuk menggunakan jawaban Hiren , tetapi menggunakan UIViewalih-alih UIImageView, dan menarik garis dalam gaya iOS 7:

UIColor iOS7LineColor = [UIColor colorWithRed:0.82f green:0.82f blue:0.82f alpha:1.0f];

//First cell in a section
if (indexPath.row == 0) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

} else if (indexPath.row == [self.tableViewCellSubtitles count] - 1) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

    UIView *lineBottom = [[UIView alloc] initWithFrame:CGRectMake(0, 43, self.view.frame.size.width, 1)];
    lineBottom.backgroundColor = iOS7LineColor;
    [cell addSubview:lineBottom];
    [cell bringSubviewToFront:lineBottom];

} else {

    //Last cell in the table view
    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];
}

Jika Anda menggunakan ini, pastikan Anda memasukkan ketinggian tampilan tabel yang benar di pernyataan if kedua. Saya harap ini bermanfaat bagi seseorang.

Enrico Susatyo
sumber
7

Di subkelas UITableViewCell Anda, ganti layoutSubviews dan sembunyikan _UITableViewCellSeparatorViewView. Bekerja di bawah iOS 10.

override func layoutSubviews() {
    super.layoutSubviews()

    subviews.forEach { (view) in
        if view.dynamicType.description() == "_UITableViewCellSeparatorView" {
            view.hidden = true
        }
    }
}
Tualatrix Chou
sumber
tidak ada solusi di atas yang berhasil ,, ini bekerja pada ios 12
Abdul Waheed
Ini mungkin ditolak dari App Store karena mengakses API pribadi.
Elliot Fiske
5

Saya tidak percaya pendekatan ini akan bekerja dalam keadaan apa pun dengan sel dinamis ...

if (indexPath.row == self.newCarArray.count-1) {
  cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}

Tidak masalah metode tableview mana yang Anda lakukan untuk sel dinamis sel tempat Anda mengubah properti inset akan selalu memiliki properti inset yang ditetapkan sekarang setiap kali dequeued menyebabkan mengamuk dari pemisah garis yang hilang ... Itu sampai Anda ubah sendiri

Sesuatu seperti ini bekerja untuk saya:

if indexPath.row == franchises.count - 1 {
  cell.separatorInset = UIEdgeInsetsMake(0, cell.contentView.bounds.width, 0, 0)
} else {
  cell.separatorInset = UIEdgeInsetsMake(0, 0, cell.contentView.bounds.width, 0)
}

Dengan begitu Anda memperbarui status struktur data Anda di setiap beban

Greg Price
sumber
4

Di Swift menggunakan iOS 8.4 :

/*
    Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
                        willDisplayCell cell: UITableViewCell,
                        forRowAtIndexPath indexPath: NSIndexPath)
{
    if indexPath.row == 3 {
        // Hiding separator line for only one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
    }
}

Catatan: cuplikan di atas ini akan berfungsi di UITableView menggunakan sel dinamis. Satu-satunya masalah yang dapat Anda temui adalah ketika Anda menggunakan sel statis dengan kategori, tipe pemisah yang berbeda dari tidak ada dan gaya yang dikelompokkan untuk tampilan tabel. Bahkan, dalam kasus khusus ini tidak akan menyembunyikan sel terakhir dari setiap kategori. Untuk mengatasinya, solusi yang saya temukan adalah mengatur pemisah sel (melalui IB) menjadi tidak ada dan kemudian membuat dan menambahkan secara manual (melalui kode) tampilan garis Anda ke setiap sel. Sebagai contoh, silakan periksa cuplikan di bawah ini:

/*
Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
    willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath)
{
    // Row 2 at Section 2
    if indexPath.row == 1 && indexPath.section == 1 {
        // Hiding separator line for one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)

        // Here we add a line at the bottom of the cell (e.g. here at the second row of the second section).
        let additionalSeparatorThickness = CGFloat(1)
        let additionalSeparator = UIView(frame: CGRectMake(0,
            cell.frame.size.height - additionalSeparatorThickness,
            cell.frame.size.width,
            additionalSeparatorThickness))
        additionalSeparator.backgroundColor = UIColor.redColor()
        cell.addSubview(additionalSeparator)
    }
}
Raja-Penyihir
sumber
Dalam proyek saya, ini berfungsi untuk sel statis tetapi tidak untuk yang dinamis. Dalam kasus terakhir, isi sel terakhir digeser ke kanan (seperti garis pemisah). Ada ide, mengapa ini bisa terjadi?
Bastian
Cuplikan pertama dari jawaban di atas akan berfungsi di UITableView menggunakan sel dinamis. Satu-satunya masalah yang dapat Anda temui adalah ketika Anda menggunakan sel statis dengan kategori, tipe pemisah yang berbeda dari tidak ada dan gaya yang dikelompokkan untuk tampilan tabel. Bahkan, dalam kasus khusus ini tidak akan menyembunyikan sel terakhir dari setiap kategori. Untuk mengatasinya, solusi yang saya temukan adalah mengatur pemisah sel (melalui IB) menjadi tidak ada dan kemudian membuat dan menambahkan secara manual (melalui kode) tampilan garis Anda ke setiap sel. Sebagai contoh, harap periksa cuplikan kedua dari jawaban di atas.
King-Wizard
itu menggeser teks (judul), jadi tidak berguna!
user155
4

Gunakan subkelas ini, set separatorInsettidak berfungsi untuk iOS 9.2.1, konten akan diperas.

@interface NSPZeroMarginCell : UITableViewCell

@property (nonatomic, assign) BOOL separatorHidden;

@end

@implementation NSPZeroMarginCell

- (void) layoutSubviews {
    [super layoutSubviews];

    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            if (CGRectGetHeight(view.frame) < 3) {
                view.hidden = self.separatorHidden;
            }
        }
    }
}

@end

https://gist.github.com/liruqi/9a5add4669e8d9cd3ee9

liruqi
sumber
4

Yang jauh lebih sederhana dan logis adalah melakukan ini:

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

Dalam kebanyakan kasus, Anda tidak ingin melihat hanya pemisah tableCiewCell terakhir. Dan pendekatan ini hanya menghapus pemisah tableViewCell terakhir, dan Anda tidak perlu memikirkan masalah autolayout (mis. Perangkat yang berputar) atau nilai hardcode untuk mengatur insets pemisah.

rostislawk
sumber
1
Selamat Datang di Stack Overflow! Jawaban yang lebih baik untuk pembaca masa depan akan menjelaskan mengapa ini lebih sederhana dan lebih logis.
CGritton
solusi yang bagus!
geek1706
3

Dalam willdisplaycell:

cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
Kimate Richards
sumber
3

Menggunakan Swift 3 dan mengadopsi metode peretasan tercepat, Anda dapat meningkatkan kode menggunakan ekstensi :

extension UITableViewCell {

    var isSeparatorHidden: Bool {
        get {
            return self.separatorInset.right != 0
        }
        set {
            if newValue {
                self.separatorInset = UIEdgeInsetsMake(0, self.bounds.size.width, 0, 0)
            } else {
                self.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
            }
        }
    }

}

Lalu, saat Anda mengkonfigurasi sel:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "identifier", for: indexPath)
    switch indexPath.row {
       case 3:
          cell.isSeparatorHidden = true
       default:
          cell.isSeparatorHidden = false
    }
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)
    if cell.isSeparatorHidden { 
       // do stuff
    }
}
Luca Davanzo
sumber
2
  if([_data count] == 0 ){
       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];//  [self tableView].=YES;
    } else {
      [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];////    [self tableView].hidden=NO;
    }
Gank
sumber
2

Cara terbaik untuk mencapai ini adalah mematikan pemisah garis default, subkelas, UITableViewCelldan menambahkan pemisah garis khusus sebagai subview dari contentView- lihat di bawah sel kustom yang digunakan untuk menyajikan objek tipe SNStockyang memiliki dua sifat string, tickerdan name:

import UIKit

private let kSNStockCellCellHeight: CGFloat = 65.0
private let kSNStockCellCellLineSeparatorHorizontalPaddingRatio: CGFloat = 0.03
private let kSNStockCellCellLineSeparatorBackgroundColorAlpha: CGFloat = 0.3
private let kSNStockCellCellLineSeparatorHeight: CGFloat = 1

class SNStockCell: UITableViewCell {

  private let primaryTextColor: UIColor
  private let secondaryTextColor: UIColor

  private let customLineSeparatorView: UIView

  var showsCustomLineSeparator: Bool {
    get {
      return !customLineSeparatorView.hidden
    }
    set(showsCustomLineSeparator) {
      customLineSeparatorView.hidden = !showsCustomLineSeparator
    }
  }

  var customLineSeparatorColor: UIColor? {
   get {
     return customLineSeparatorView.backgroundColor
   }
   set(customLineSeparatorColor) {
     customLineSeparatorView.backgroundColor = customLineSeparatorColor?.colorWithAlphaComponent(kSNStockCellCellLineSeparatorBackgroundColorAlpha)
    }
  }

  required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  init(reuseIdentifier: String, primaryTextColor: UIColor, secondaryTextColor: UIColor) {
    self.primaryTextColor = primaryTextColor
    self.secondaryTextColor = secondaryTextColor
    self.customLineSeparatorView = UIView(frame:CGRectZero)
    super.init(style: UITableViewCellStyle.Subtitle, reuseIdentifier:reuseIdentifier)
    selectionStyle = UITableViewCellSelectionStyle.None
    backgroundColor = UIColor.clearColor()

    contentView.addSubview(customLineSeparatorView)
    customLineSeparatorView.hidden = true
  }

  override func prepareForReuse() {
    super.prepareForReuse()
    self.showsCustomLineSeparator = false
  }

  // MARK: Layout

  override func layoutSubviews() {
    super.layoutSubviews()
    layoutCustomLineSeparator()
  }

  private func layoutCustomLineSeparator() {
    let horizontalPadding: CGFloat = bounds.width * kSNStockCellCellLineSeparatorHorizontalPaddingRatio
    let lineSeparatorWidth: CGFloat = bounds.width - horizontalPadding * 2;
    customLineSeparatorView.frame = CGRectMake(horizontalPadding,
      kSNStockCellCellHeight - kSNStockCellCellLineSeparatorHeight,
      lineSeparatorWidth,
      kSNStockCellCellLineSeparatorHeight)
  }

  // MARK: Public Class API

  class func cellHeight() -> CGFloat {
    return kSNStockCellCellHeight
  }

  // MARK: Public API

  func configureWithStock(stock: SNStock) {
    textLabel!.text = stock.ticker as String
    textLabel!.textColor = primaryTextColor
    detailTextLabel!.text = stock.name as String
    detailTextLabel!.textColor = secondaryTextColor
    setNeedsLayout()
  } 
}

Untuk menonaktifkan penggunaan pemisah garis default tableView.separatorStyle = UITableViewCellSeparatorStyle.None;,. Sisi konsumen relatif sederhana, lihat contoh di bawah ini:

private func stockCell(tableView: UITableView, indexPath:NSIndexPath) -> UITableViewCell {
  var cell : SNStockCell? = tableView.dequeueReusableCellWithIdentifier(stockCellReuseIdentifier) as? SNStockCell
  if (cell == nil) {
    cell = SNStockCell(reuseIdentifier:stockCellReuseIdentifier, primaryTextColor:primaryTextColor, secondaryTextColor:secondaryTextColor)
  }
  cell!.configureWithStock(stockAtIndexPath(indexPath))
  cell!.showsCustomLineSeparator = true
  cell!.customLineSeparatorColor = tintColor
  return cell!
}
Zorayr
sumber
2

Untuk Swift 2:

tambahkan baris berikut ke viewDidLoad():

tableView.separatorColor = UIColor.clearColor()
Sebastian
sumber
2

jika jawaban yang diterima tidak berfungsi, Anda dapat mencoba ini:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.01f; }

Itu bagus ;)

debiasej
sumber
1

Coba kode di bawah ini, mungkin dapat membantu Anda menyelesaikan masalah Anda

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

   NSString* reuseIdentifier = @"Contact Cell";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    if (nil == cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
if (indexPath.row != 10) {//Specify the cell number
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithLine.png"]];

} else {
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithOutLine.png"]];

}

    }

    return cell;
}
Nakkeeran
sumber
1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

       NSString *cellId = @"cell";
       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
       NSInteger lastRowIndexInSection = [tableView numberOfRowsInSection:indexPath.section] - 1;

       if (row == lastRowIndexInSection) {
              CGFloat halfWidthOfCell = cell.frame.size.width / 2;
              cell.separatorInset = UIEdgeInsetsMake(0, halfWidthOfCell, 0, halfWidthOfCell);
       }
}
Adobels
sumber
1

Anda harus mengambil sel khusus dan menambahkan Label dan menetapkan batasan seperti label harus mencakup seluruh area sel. dan tulis baris di bawah ini di konstruktor.

- (void)awakeFromNib {
    // Initialization code
    self.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
    //self.layoutMargins = UIEdgeInsetsZero;
    [self setBackgroundColor:[UIColor clearColor]];
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
}

Juga atur margin Layout UITableView sebagai berikut

tblSignup.layoutMargins = UIEdgeInsetsZero;
Coder_A_D
sumber
1

Saya tidak bisa menyembunyikan pemisah pada sel tertentu kecuali menggunakan solusi berikut ini

- (void)layoutSubviews {
    [super layoutSubviews];
    [self hideCellSeparator];
}
// workaround
- (void)hideCellSeparator {
    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            [view removeFromSuperview];
        }
    }
}
Mahmoud Adam
sumber
1

Untuk iOS7 dan di atasnya, cara yang lebih bersih adalah dengan menggunakan INFINITY alih-alih nilai hardcoded. Anda tidak perlu khawatir memperbarui sel ketika layar berputar.

if (indexPath.row == <row number>) {
    cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}
Xchord
sumber
3
Berhati-hatilah: Menggunakan INFINITY menyebabkan pengecualian runtime di iOS9
AndrewR
1

Seperti yang ditunjukkan oleh banyak orang, Anda dapat dengan mudah menyembunyikan semua pemisah UITableViewCell hanya dengan mematikannya untuk seluruh UITableView itu sendiri; misalnya di UITableViewController Anda

- (void)viewDidLoad {
    ...
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    ...
}

Sayangnya, ini adalah PITA nyata untuk dilakukan pada per sel , yang sebenarnya Anda tanyakan.

Secara pribadi, saya sudah mencoba banyak permutasi untuk mengubah cell.separatorInset.left , sekali lagi, seperti yang (banyak) orang lain sarankan, tetapi masalahnya adalah, mengutip Apple (penekanan ditambahkan):

" ... Anda dapat menggunakan properti ini untuk menambahkan ruang antara isi sel saat ini dan tepi kiri dan kanan tabel. Nilai inset positif memindahkan konten sel dan pemisah sel ke dalam dan menjauh dari tepi tabel ... "

Jadi, jika Anda mencoba 'menyembunyikan' pemisah dengan mendorongnya ke luar layar ke kanan, Anda juga dapat membuat indentasi konten sel Anda juga. Seperti yang disarankan oleh crifan, Anda kemudian dapat mencoba untuk mengkompensasi efek samping buruk ini dengan mengatur cell.indentationWidthdancell.indentationLevel tepat memindahkan semuanya kembali, tetapi saya telah menemukan ini juga tidak dapat diandalkan (konten masih mendapatkan indentasi ...).

Cara paling andal yang saya temukan adalah melakukan over-ride layoutSubviewsdalam subclass UITableViewCell sederhana dan mengatur inset kanan sehingga menyentuh inset kiri, membuat pemisah memiliki 0 lebar dan tidak terlihat [ini perlu dilakukan dalam layoutSubviews untuk secara otomatis menangani rotasi]. Saya juga menambahkan metode kenyamanan ke subkelas saya untuk mengaktifkannya.

@interface MyTableViewCellSubclass()
@property BOOL separatorIsHidden;
@end

@implementation MyTableViewCellSubclass

- (void)hideSeparator
{
    _separatorIsHidden = YES;
}

- (void)layoutSubviews
{
    [super layoutSubviews];

    if (_separatorIsHidden) {
        UIEdgeInsets inset = self.separatorInset;
        inset.right = self.bounds.size.width - inset.left;
        self.separatorInset = inset;
    }
}

@end

Peringatan: tidak ada cara yang dapat diandalkan untuk mengembalikan inset kanan yang asli , jadi Anda tidak dapat 'membatalkan' pemisah, maka dari itu mengapa saya menggunakan hideSeparatormetode yang tidak dapat diubah (vs mengekspos separatorIsHidden). Harap perhatikan separatorInset tetap ada di seluruh sel yang digunakan kembali sehingga, karena Anda tidak dapat 'un-hide', Anda perlu menjaga sel-sel separator tersembunyi ini terisolasi di reuseIdentifier mereka sendiri.

tiritea
sumber
1

Persyaratan saya adalah menyembunyikan pemisah antara sel ke-4 dan ke-5. Saya mencapainya dengan

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if(indexPath.row == 3)
    {
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
    }
}
SMS
sumber
1

Cepat:

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    ...

    // remove separator for last cell
    cell.separatorInset = indexPath.row < numberOfRowsInSection-1
        ? tableView.separatorInset
        : UIEdgeInsets(top: 0, left: tableView.bounds.size.width, bottom: 0, right: 0)

    return cell
}

Tujuan-C:

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

    ...

    // remove separator for last cell
    cell.separatorInset = (indexPath.row < numberOfRowsInSection-1)
        ? tableView.separatorInset
        : UIEdgeInsetsMake(0.f, tableView.bounds.size.width, 0.f, 0.f);

    return cell;
}
RyuX51
sumber
1

Di dalam kelas sel tampilan tabel. letakkan baris kode ini

separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)
M. Nadeeshan
sumber
Tidak memperhitungkan perubahan tata letak perangkat / adegan.
Womble
0

Di iOS9 saya punya masalah bahwa mengubah inset pemisah juga memengaruhi posisi teks- dan detailLabel.

Saya menyelesaikannya dengan ini

override func layoutSubviews() {
    super.layoutSubviews()

    separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}
Saren Inden
sumber
Tidak berfungsi dengan kelas UITableViewCell - TextLabel dan DetailedTextLabel menjauh dari sel.
Nik Kov