Bir UITableViewCell'de ayırıcı çizgiyi gizle


250

Ben özelleştiriyorum UITableView. Son hücrede ayıran çizgiyi gizlemek istiyorum ... bunu yapabilir miyim?

Yapabileceğimi biliyorum tableView.separatorStyle = UITableViewCellStyle.Noneama bu tableView tüm hücreleri etkileyecektir . Sadece son hücremden etkilenmesini istiyorum.



Sorunuz benimkini yanıtladı. tableView.separatorStyle = UITableViewCellStyle.None ihtiyacım olan hat değildi
Malachi Holden

Yanıtlar:


371

içinde viewDidLoad, bu satırı ekleyin:

self.tableView.separatorColor = [UIColor clearColor];

ve içinde cellForRowAtIndexPath:

iOS alt sürümleri için

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

iOS 7 üst sürümleri için (iOS 8 dahil)

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

4
Bu, iOS7 ve iOS8'de çalışacaktır. Ayırıcıyı sıfıra etkili bir şekilde sıkar. cell.separatorInset = UIEdgeInsetsMake (0, CGRectGetWidth (cell.bounds) /2,0, 0, CGRectGetWidth (cell.bounds) /2,0)
Harris

9
Bir hatırlatma: iDevice'iniz iPad ve hücre Otomatik Düzenleme kullanıldığında, "cell.bounds.size.width" tarafından döndürülen değer gerçek hücrenin genişliğine eşit olmayabilir. Bu yüzden her zaman "cell.bounds.size.width" yerine "tableView.frame.size.width" kullanıyorum.
Veight Zhou

5
Lütfen dikkat: [cell.contentView addSubview:line]yerine kullanmalısınız[cell addSubview:line]
Anastasia

6
cell.separator'ı değiştir Sol eki ayarla, hücre içeriğinin sol ekini de değiştirir. Sadece ayırıcı çizgi değil. Apple doc'dan: "Bu özelliği, geçerli hücrenin içeriği ile tablonun sol ve sağ kenarları arasına boşluk eklemek için kullanabilirsiniz. Pozitif ek değerler, hücre içeriğini ve hücre ayırıcıyı tablo kenarlarından içe ve uzağa taşır."
zgjie

9
Kötü bir fikir. İçindeki bir hücreye hiçbir zaman alt görünüm eklememelisiniz cellForRowAtIndexPath. Hücrelerin yeniden kullanıldığını unutmayın. Bu hücre her kullanıldığında başka bir ayırıcı satır görünümü ekleyeceksiniz. Büyük listelerde kaydırma performansını etkileyebilir. Ve bunu yapmanın doğru yolu değil.
Dave Batton

247

Aşağıdaki kodu kullanabilirsiniz:

Swift:

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

veya:

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

varsayılan Marj için:

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

ayırıcıyı uçtan uca göstermek

cell.separatorInset = .zero

Objective-C:

if (indexPath.row == {your row number}) {
    cell.separatorInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, CGFLOAT_MAX);
}

Gruplandırılmış bir grup için UITableViewçalışmaz, kabul edilen cevap ise çalışır.
Aleks

3
Bu iOS9 için çalışmıyor, self.tableView.separatorColor = [UIColor clearColor];düzeltildi.
Ben

1
Tam bir hack ama iOS 9'da çalışan şey: cell.layoutMargins = UIEdgeInsetsZero; cell.separatorInset = UIEdgeInsetsMake (0, 0, 0, 9999)
Pat Niemeyer

cell.separatorInset = UIEdgeInsetsMake(0.f, 0.f, 0.f, cell.bounds.size.width-cell.layoutMargins.left);İOS 8+'de benim için böyle çalışır: cell.layoutMargins.left değerini çıkarmazsam, ayırıcı çizgi sol kenarlıktan sol kenar boşluğuna (varsa) çizilir.
Alexandre OS

3
Bu, herhangi bir textLabelekran dışına iter .
aehlke

99

Hiren'in cevabını takip etmek .

içinde viewDidLoad ve aşağıdaki hattı:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

Veya XIB veya Storyboard'ları kullanıyorsanız " separator " u " none " olarak değiştirin:

Arayüz oluşturucu

Ve CellForRowAtIndexPath'de bunu ekleyin:

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

Dinamik Hücrelerle bir tablo görünümü görüntülediğim sonuca bir örnek (ancak yalnızca içeriği olan tek bir tane var). Sonuç olarak sadece bir ayırıcı vardır ve tüm "kukla" olanları tableview otomatik olarak ekranı doldurmak için eklenir olmasıdır.

resim açıklamasını buraya girin

Bu yardımcı olur umarım.

DÜZENLEME: Her zaman yorumları okumayanlar için, aslında bunu birkaç satır kodla yapmanın daha iyi bir yolu vardır:

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

Bence, ayırıcı çizgiyi gizlemek için doğru yaklaşım budur. self.tableView.separatorStyle = .none
arango_86

52

Ayırıcıyı kendiniz çizmek istemiyorsanız, bunu kullanın:

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

Bu API yalnızca iOS 7'den başlayarak kullanılabilir.


8
separatorInsettelafi etmek için başka bir kesmek gerektiren hücre içeriği yanı sıra ayırıcı eklemek gibi görünüyor:cell.IndentationWidth = -10000;
crishoj

23
Daha iyi bir yöntem, separatorInsetüst, sol ve alt için 0'a ve sağ için hücre genişliğine cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, cell.bounds.size.width); ayarlamaktır : Bu, diğer hücre özelliklerinin ayarlanmasını gerektirmez.
Eylül13

Ek için hücre sınırları genişliğini kullanıyorsanız, arayüz döndüğünde yeniden hesaplamanız gerekebilir.
AndrewR

Bunu yapmak için yaptığınız hücre, ayırıcıyı gizlemek istemediğiniz başka bir hücre çizmek için yeniden kullanılırsa, ayırıcı da oradan gider.
Michael Peterson

1
UIEdgeInsetsMake (0, 10000, 0, 0); çalıştı -> UIEdgeInsetsMake (0, 0, 0, cell.bounds.size.width); olmadı. 4 "+ cihazlarda eserler 375-320px bölüm = 55px kalır neden xibs ve styoryboards 3.5" boyutlu vcs tutmak kötü bir alışkanlık var sanırım. (yoda sesiyle) ve çok çirkin!
Anton Tropashko

29

geliştirme ortamım

  • Xcode 7.0
  • 7A220 Swift 2.0
  • iOS 9.0

yukarıdaki cevaplar benim için tam olarak çalışmıyor

denedikten sonra, sonunda benim çalışma çözümü:

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

ve etkisi: resim açıklamasını buraya girin


20

separatorInset.right = .greatestFiniteMagnitudeCep telefonunuzda ayarlayın .


bunu çağırmak awakeFromNibtüm ekranın yanıp sönmesine neden olabilirapplicationDidBecomeActive
Breadbin

Bu, programlı UITableViewCell oluşturma işleminden cihazdaki iOS 12.2'yi çalıştırır. Güzel.
Womble

Sağ ayırıcıyı ayarlamak cellForRowAt içinde ayarladığımda benim için çalıştı. En iyi çözümler. Benim için iOS 10'dan 13'e kadar çalışıyor. İOS 10, 12 ve 13'te test edildi. Sol kenar boşluğu ayarlandığında iOS 10 için çalışmıyor.
Ariel Bogdziewicz

18

In Swift 3, Swift 4 ve Swift 5 , böyle UITableViewCell bir uzantı yazabilirsiniz:

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

Daha sonra bunu aşağıdaki gibi kullanabilirsiniz (hücre hücre örneğiniz olduğunda):

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

Tablo görünümü hücresinin genişliğini rastgele bir sayı atamak yerine sol iç metin olarak atamak gerçekten daha iyidir. Çünkü bazı ekran boyutlarında, şimdi değil ama gelecekte ayırıcılarınız hala görülebilir çünkü bu rastgele sayı yeterli olmayabilir. Ayrıca, manzara modunda iPad'de ayırıcılarınızın her zaman görünmez olacağını garanti edemezsiniz.


Bu, gruplanmış UITableView için çalışmaz. Gruplandırılmış vaka için çözümünüz var mı?
zslavman

8

İOS 7 ve 8 için daha iyi çözüm

-(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);
    }
}

Uygulamanız dönebiliyorsa - sol gömme sabit için 3000.0f kullanın veya anında kireçleyin. Sağa yerleştirmeyi ayarlamaya çalışırsanız, iOS 8'de hücrenin sol tarafında ayırıcının görünür bir parçası vardır.


1
Neden böyle bir şey yapabileceğinizde rastgele bir sayı kullanıyorsunuz: MAX ([[UIScreen mainScreen] sınırları] .size.width, [[UIScreen mainScreen] sınırları] .size.height); her zaman gittiğinden emin olmak için
Daniel Galasko

7

İOS 7'de UITableView gruplandırılmış stil hücre ayırıcısı biraz farklı görünüyor. Biraz şuna benziyor:

resim açıklamasını buraya girin

Kemenaran'ın bunu yapma cevabını denedim :

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

Ancak bu benim için işe yaramıyor. Neden olduğundan emin değilim. Bu yüzden Hiren'in cevabını kullanmaya karar verdim , ancak UIViewyerine kullanmak UIImageViewve çizgiyi iOS 7 tarzında çiziyor:

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

Bunu kullanırsanız, ikinci if ifadesine doğru tablo görünümü yüksekliğini eklediğinizden emin olun. Umarım bu birisi için faydalıdır.


7

UITableViewCell alt sınıfınızda layoutSubviews öğesini geçersiz kılın ve _UITableViewCellSeparatorView öğesini gizleyin. İOS 10 altında çalışır.

override func layoutSubviews() {
    super.layoutSubviews()

    subviews.forEach { (view) in
        if view.dynamicType.description() == "_UITableViewCellSeparatorView" {
            view.hidden = true
        }
    }
}

Yukarıdaki çözümlerden hiçbiri işe yaramadı, bu ios 12 üzerinde çalışıyor
Abdul Waheed

Bu, özel API'lara eriştiği için App Store'dan reddedilebilir.
Elliot Fiske

5

Bu yaklaşımın dinamik hücrelerle hiçbir koşulda işe yarayacağına inanmıyorum ...

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

Dinamik tablolar için hangi tablo görüntüleme yöntemini uyguladığınız önemli değildir, inset özelliğini değiştirdiğiniz hücre her seferinde her açıldığında artık inset özelliği ayarlanmış olur, eksik satır ayırıcılarının rampasına neden olur ... kendiniz değiştirin.

Bunun gibi bir şey benim için çalıştı:

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

Bu şekilde her yükte veri yapısı durumunu güncellersiniz


4

Gelen Swift kullanılarak 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)
    }
}

Not: Yukarıdaki bu snippet, dinamik hücreler kullanarak UITableView üzerinde çalışacaktır. Karşılaşabileceğiniz tek sorun, kategorilerle statik hücreler, hiçbirinden farklı bir ayırıcı türü ve tablo görünümü için gruplandırılmış bir stil kullanmanızdır. Aslında, bu özel durumda, her kategorinin son hücresini gizlemeyecektir. Bunun üstesinden gelmek için bulduğum çözüm, hücre ayırıcısını (IB aracılığıyla) yok olarak ayarlamak ve daha sonra her hücreye satır görünümünüzü manuel olarak (kod aracılığıyla) oluşturmak ve eklemekti. Bir örnek için lütfen aşağıdaki snippet'i kontrol edin:

/*
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)
    }
}

Projemde, bu statik hücreler için çalışıyor, ancak dinamik hücreler için değil. İkinci durumda, son hücrenin içeriği sağa kaydırılır (tıpkı ayırıcı çizgisi gibi). Herhangi bir fikir, neden olabilir?
Bastian

Yukarıdaki cevabın ilk snippet'i dinamik hücreler kullanılarak UITableView üzerinde çalışacaktır. Karşılaşabileceğiniz tek sorun, kategorilerle statik hücreler, hiçbirinden farklı bir ayırıcı türü ve tablo görünümü için gruplandırılmış bir stil kullanmanızdır. Aslında, bu özel durumda, her kategorinin son hücresini gizlemeyecektir. Bunun üstesinden gelmek için bulduğum çözüm, hücre ayırıcısını (IB aracılığıyla) yok olarak ayarlamak ve daha sonra her hücreye satır görünümünüzü manuel olarak (kod aracılığıyla) oluşturmak ve eklemekti. Bir örnek için lütfen yukarıdaki cevabın ikinci pasajını kontrol edin.
Kral Sihirbazı

metni (başlık) kaydırır, bu yüzden işe yaramaz!
user155

4

Bu alt sınıfı kullanın, set separatorInsetiOS 9.2.1 için çalışmaz, içerik sıkılır.

@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


4

Çok daha basit ve mantıklı bunu yapmaktır:

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

Çoğu durumda yalnızca son tableCiewCell ayırıcısını görmek istemezsiniz. Ve bu yaklaşım yalnızca son tableViewCell ayırıcısını kaldırır ve ayırıcı eklerini ayarlamak için otomatik yerleşim sorunları (döner aygıt) veya sabit kod değerleri hakkında düşünmeniz gerekmez.


1
Stack Overflow'a hoş geldiniz! Gelecekteki okuyucular için daha iyi bir cevap, bunun neden daha basit ve daha mantıklı olduğunu açıklayacaktır.
CGritton

güzel bir çözüm!
geek1706

3

İçinde willdisplaycell:

cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)

3

Swift 3'ü kullanarak ve en hızlı saldırı yöntemini benimseyerek, uzantıları kullanarak kodu geliştirebilirsiniz :

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

}

Ardından, hücreyi yapılandırdığınızda:

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

2
  if([_data count] == 0 ){
       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];//  [self tableView].=YES;
    } else {
      [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];////    [self tableView].hidden=NO;
    }

2

Bunu başarmak için en iyi yolu varsayılan hat ayırıcılar, alt sınıf kapatmak olur UITableViewCellve bir subview özel hat ayırıcı eklemek contentView- türünde bir nesne sunmak için kullanılan özel bir hücreye aşağıya bakın SNStockiki dize özellikleri vardır, tickerve 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()
  } 
}

Varsayılan satır ayırıcısını devre dışı bırakmak için tableView.separatorStyle = UITableViewCellSeparatorStyle.None;,. Tüketici tarafı nispeten basittir, aşağıdaki örneğe bakın:

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

2

Swift 2 için:

şu satırı ekleyin viewDidLoad():

tableView.separatorColor = UIColor.clearColor()

2

kabul edilen cevap işe yaramazsa şunu deneyebilirsiniz:

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

Bu harika ;)


1

Aşağıdaki kodu deneyin, sorununuzu çözmenize yardımcı olabilir

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

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

1

Özel hücre almanız ve Etiket eklemeniz ve etiketin tüm hücre alanını kapsaması gibi bir kısıtlama ayarlamanız gerekir. ve yapıcıya aşağıdaki satırı yazın.

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

Ayrıca UITableView Layout kenar boşluğunu aşağıdaki gibi ayarlayın

tblSignup.layoutMargins = UIEdgeInsetsZero;

1

Aşağıdaki geçici çözümü kullanmak dışında ayırıcıyı belirli bir hücrede gizleyemedim

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

1

İOS7 ve üstü için daha temiz yol, sabit kodlanmış değer yerine INFINITY kullanmaktır. Ekran döndüğünde hücreyi güncelleme konusunda endişelenmenize gerek yoktur.

if (indexPath.row == <row number>) {
    cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}

3
Dikkat edin: INFINITY kullanmak iOS9'da bir çalışma zamanı istisnasına neden oluyor
AndrewR

1

Diğerlerinin işaret ettiği gibi, tüm UITableViewCell ayırıcılarını tüm UITableView'ın kendisi için kapatarak kolayca gizleyebilirsiniz ; örneğin UITableViewController'ınızda

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

Ne yazık ki, gerçekten sormak istediğiniz şey, hücre başına yapmak için gerçek bir PITA .

Şahsen, çok sayıda permütasyonu denedim. cell.separatorInset.left başkalarının önerdiği gibi, tekrar , ancak sorun Apple'ı alıntılamak (vurgu eklendi):

" ... Bu özelliği, geçerli hücrenin içeriği ile tablonun sol ve sağ kenarları arasına boşluk eklemek için kullanabilirsiniz . Pozitif ek değerler , hücre içeriğini ve hücre ayırıcıyı tablo kenarlarından içe ve uzağa taşır ... "

Dolayısıyla, ayırıcıyı ekranın dışına doğru kaydırarak 'gizlemeye' çalışırsanız, hücrenizin contentView öğesini de girintili hale getirebilirsiniz. Crifan'ın önerdiği gibi, bu kötü yan etkiyi ayarlayarak cell.indentationWidthvecell.indentationLevel her şeyi geri taşıyabilir uygun şekilde geri taşıyabilirsiniz, ancak bunun da güvenilir olmadığını gördüm (içerik hala girintili hale geliyor ...).

Bulduğum en güvenilir yol, layoutSubviewsbasit bir UITableViewCell alt sınıfında aşırı sürüş yapmak ve sağ iç kısmı sol iç metine çarpacak şekilde ayarlamak, ayırıcıyı 0 genişliğe ve çok görünmez hale getirmektir [bunun otomatik olarak yapılması gerekir döndürme tutamağı]. Bunu açmak için alt sınıfıma bir kolaylık yöntemi de ekliyorum.

@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

Dikkat: Orijinal sağ eki geri yüklemek için güvenilir bir yol yoktur , bu nedenle ayırıcıyı 'gizleyemezsiniz', bu yüzden neden geri döndürülemez bir hideSeparatoryöntem kullanıyorum (separatorIsHidden açığa çıkarmaya karşı). Lütfen separatorInset öğesinin yeniden kullanılan hücreler arasında kaldığını unutmayın, bu nedenle 'gizlemeyi kaldıramazsınız', bu gizli ayırıcı hücreleri kendi yeniden kullanım tanımlayıcılarında yalıtılmış tutmanız gerekir.


1

Benim gereksinim 4. ve 5. hücre arasındaki ayırıcıyı gizlemekti. Tarafından başardım

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

1

Swift:

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
}

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

1

Tableview hücre sınıfının içinde. bu kod satırını koy

separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)

Cihaz / sahne düzeni değişikliklerini hesaba katmaz.
Womble

0

İOS9'da, ayırıcı iç metinleri değiştirmenin, text- ve detailLabel öğesinin konumlandırmasını da etkilemesi sorunu yaşadım.

Bununla çözdüm

override func layoutSubviews() {
    super.layoutSubviews()

    separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}

UITableViewCell sınıfıyla çalışmaz - TextLabel ve DetailTextLabel hücreden uzaklaşır.
Nik Kov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.