Ukryj linię separatora w jednym UITableViewCell

250

Dostosowuję UITableView. Chcę ukryć linię oddzielającą ostatnią komórkę ... czy mogę to zrobić?

Wiem, że mogę to zrobić, tableView.separatorStyle = UITableViewCellStyle.Noneale wpłynęłoby to na wszystkie komórki tableView. Chcę, żeby wpłynęło to tylko na moją ostatnią komórkę.

Safari
źródło
Twoje pytanie odpowiedziało na moje. tableView.separatorStyle = UITableViewCellStyle.Nie potrzebowałem linii
Malachi Holden

Odpowiedzi:

371

w viewDidLoad, dodaj tę linię:

self.tableView.separatorColor = [UIColor clearColor];

oraz w cellForRowAtIndexPath:

dla niższych wersji iOS

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

dla wyższych wersji iOS 7 (w tym iOS 8)

if (indexPath.row == self.newCarArray.count-1) {
    cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}
Dzierżawa
źródło
4
Będzie to działać na iOS7 i iOS8. Skutecznie ściska separator do zera. cell.separatorInset = UIEdgeInsetsMake (0, CGRectGetWidth (cell.bounds) / 2.0, 0, CGRectGetWidth (cell.bounds) / 2.0)
Harris
9
Jedno przypomnienie: gdy iDevice to iPad, a komórka jest używana w trybie AutoLayout, wartość zwracana przez „cell.bounds.size.width” może nie być równa rzeczywistej szerokości komórki. Dlatego zawsze używam „tableView.frame.size.width” zamiast „cell.bounds.size.width”.
Veight Zhou
5
Uwaga: [cell.contentView addSubview:line]zamiast tego należy użyć[cell addSubview:line]
Anastasia
6
change cell.separatorInset lewa wstawka zmieni również lewą wstawkę zawartości komórki. Nie tylko linia separatora. Z Apple Doc: „Za pomocą tej właściwości można dodać spację między zawartością bieżącej komórki a lewą i prawą krawędzią tabeli. Pozytywne wartości wstawki przesuwają zawartość komórki i separator komórek do wewnątrz i od krawędzi tabeli”.
zgjie
9
Kiepski pomysł. Nigdy nie należy dodawać widoków podrzędnych do komórki w cellForRowAtIndexPath. Pamiętaj, że komórki są ponownie wykorzystywane. Za każdym razem, gdy komórka zostanie ponownie użyta, dodasz kolejny widok linii separatora. Na dużych listach może to wpłynąć na wydajność przewijania. I to po prostu niewłaściwy sposób.
Dave Batton
247

Możesz użyć następującego kodu:

Szybki:

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

lub:

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

dla domyślnego marginesu:

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

aby pokazać separator od końca do końca

cell.separatorInset = .zero

Cel C:

if (indexPath.row == {your row number}) {
    cell.separatorInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, CGFLOAT_MAX);
}
Avinash
źródło
Nie działa dla zgrupowanych UITableView, podczas gdy zaakceptowana odpowiedź działa.
Aleks N.
3
To nie działa na iOS9, self.tableView.separatorColor = [UIColor clearColor];naprawiłem to.
Ben
1
To kompletny hack, ale w iOS 9 działa: cell.layoutMargins = UIEdgeInsetsZero; cell.separatorInset = UIEdgeInsetsMake (0, 0, 0, 9999)
Pat Niemeyer,
Tak to działa dla mnie w iOS 8+: cell.separatorInset = UIEdgeInsetsMake(0.f, 0.f, 0.f, cell.bounds.size.width-cell.layoutMargins.left);Jeśli nie odejmę wartości cell.layoutMargins.left, linia separatora jest rysowana od lewej granicy do lewego marginesu (jeśli taki masz).
Alexandre OS
3
Spycha to każdy textLabelekran.
aehlke
99

Kontynuacja odpowiedzi Hirena .

w ViewDidLoad i następujący wiersz:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

Lub, jeśli korzystasz z XIB lub Storyboard, zmień „ separator ” na „ none ”:

Konstruktor interfejsu

I w CellForRowAtIndexPath dodaj to:

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

Oto przykład wyniku, w którym wyświetlam widok tabeli z dynamicznymi komórkami (ale mam tylko jeden z zawartością). W rezultacie tylko ten jeden ma separator, a nie wszystkie „fałszywe” widoki tabeli automatycznie dodają do wypełnienia ekranu.

wprowadź opis zdjęcia tutaj

Mam nadzieję że to pomoże.

EDYCJA: Dla tych, którzy nie zawsze czytają komentarze, istnieje lepszy sposób, aby to zrobić za pomocą kilku wierszy kodu:

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.tableFooterView = UIView()
}
Benzoes
źródło
Myślę, że aby ukryć linię separatora, jest to właściwe podejście. self.tableView.separatorStyle = .none
arango_86
52

Jeśli nie chcesz samodzielnie rysować separatora, użyj tego:

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

Ten interfejs API jest dostępny tylko od iOS 7.

Kemenaran
źródło
8
separatorInsetwydaje się wstawiać zarówno zawartość komórki, jak i separatora, co wymaga kolejnego cell.IndentationWidth = -10000;
hacka w
23
Lepszą metodą jest ustawienie wartości separatorInset0 dla górnej, lewej i dolnej oraz szerokości komórki po prawej: cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, cell.bounds.size.width); Pozwala to uniknąć konieczności dostosowania jakichkolwiek innych właściwości komórki.
bryguy1300,
Jeśli używasz szerokości granic komórki dla wstawki, może być konieczne ponowne obliczenie, gdy interfejs się obraca.
AndrewR
Zauważ, że jeśli komórka, którą to zrobisz, zostanie ponownie użyta do narysowania innej komórki, dla której nie zamierzałeś ukrywać separatora, separator również zniknie z niego.
Michael Peterson
1
UIEdgeInsetsMake (0, 10000, 0, 0); pracował -> UIEdgeInsetsMake (0, 0, 0, cell.bounds.size.width); nie. chyba dlatego mam nieprzyjemny zwyczaj trzymania vcs wielkości 3,5 "w xibs i styoryboardach, które artefakty na urządzeniach 4" + powodują sekcję 375-320px = pozostaje 55px. (głosem yoda) i to jest bardzo brzydkie!
Anton Tropashko
29

moim środowiskiem programistycznym jest

  • Xcode 7.0
  • 7A220 Swift 2.0
  • iOS 9.0

powyższe odpowiedzi nie działają dla mnie w pełni

po wypróbowaniu moim w końcu działającym rozwiązaniem jest:

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

a efekt jest następujący: wprowadź opis zdjęcia tutaj

Crifan
źródło
20

Ustaw separatorInset.right = .greatestFiniteMagnitudena swojej komórce.

Matthew Korporaal
źródło
wywołanie tego awakeFromNibmoże spowodować, że cały ekran applicationDidBecomeActive
zacznie
Działa iOS 12.2, na urządzeniu, z programowego tworzenia UITableViewCell. Miły.
Womble
Ustawienie odpowiedniego separatora działało dla mnie, gdy ustawiam go w cellForRowAt. Najlepsze rozwiązania. Dla mnie działa z iOS 10 do 13. Testowane na iOS 10, 12 i 13. Gdy ustawiony jest lewy margines, to nie działa na iOS 10.
Ariel Bogdziewicz
18

W Swift 3, Swift 4 i Swift 5 możesz napisać rozszerzenie do UITableViewCell w następujący sposób:

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

Następnie możesz użyć tego jak poniżej (gdy komórka jest instancją komórki):

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

Naprawdę lepiej jest przypisać szerokość komórki widoku tabeli jako lewą wstawkę zamiast przypisywać jej losową liczbę. Ponieważ w niektórych wymiarach ekranu może nie teraz, ale w przyszłości separatory mogą być nadal widoczne, ponieważ ta losowa liczba może być niewystarczająca. Ponadto w iPadzie w trybie poziomym nie można zagwarantować, że separatory zawsze będą niewidoczne.

Okhan Okbay
źródło
To nie działa w przypadku UITableView w stylu zgrupowanym. Czy masz rozwiązanie dla zgrupowanej skrzynki?
zslavman
8

Lepsze rozwiązanie dla iOS 7 i 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);
    }
}

Jeśli twoja aplikacja jest obrotowa - użyj 3000.0f dla stałej lewej wstawki lub oblicz ją na bieżąco. Jeśli spróbujesz ustawić prawą wstawkę, masz widoczną część separatora po lewej stronie komórki w iOS 8.

Blaster dźwięku
źródło
1
Po co używać liczb losowych, gdy można zrobić coś takiego: MAX ([granice [UIScreen mainScreen] ogranicza] .size.width, [[granice UIScreen mainScreen]]] .size.height); aby upewnić się, że zawsze zniknęło
Daniel Galasko
7

W systemie iOS 7 separator komórek w stylu UITableView wygląda nieco inaczej. Wygląda to trochę tak:

wprowadź opis zdjęcia tutaj

Próbowałem odpowiedzieć Kemenaranowi na to:

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

Wydaje mi się jednak, że to nie działa. Nie jestem pewien dlaczego. Postanowiłem więc użyć odpowiedzi Hirena , ale UIViewzamiast tego UIImageViewnarysowałem linię w stylu 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];
}

Jeśli tego używasz, upewnij się, że podłączysz prawidłową wysokość widoku tabeli w drugiej instrukcji if. Mam nadzieję, że jest to przydatne dla kogoś.

Enrico Susatyo
źródło
7

W podklasie UITableViewCell przesłoń układ layoutSubviews i ukryj _UITableViewCellSeparatorView. Działa pod iOS 10.

override func layoutSubviews() {
    super.layoutSubviews()

    subviews.forEach { (view) in
        if view.dynamicType.description() == "_UITableViewCellSeparatorView" {
            view.hidden = true
        }
    }
}
Tualatrix Chou
źródło
żadne z powyższych rozwiązań nie działało ,, działa to na iOS 12
Abdul Waheed
Może to zostać odrzucone z App Store za dostęp do prywatnych API.
Elliot Fiske
5

Nie sądzę, aby to podejście działało w żadnych okolicznościach z dynamicznymi komórkami ...

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

Nie ma znaczenia, w jakiej metodzie widoku tabeli zastosujesz to dla komórek dynamicznych, komórka, na której zmieniłeś właściwość wstawki, zawsze będzie miała teraz ustawioną właściwość wstawki za każdym razem, gdy zostanie usunięta z kolejki, powodując gwałtowny brak separatorów linii ... zmień to sam.

Coś takiego działało dla mnie:

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

W ten sposób aktualizujesz stan struktury danych przy każdym ładowaniu

Greg Price
źródło
4

W Swift przy użyciu 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)
    }
}

Uwaga: powyższy fragment kodu będzie działał w UITableView przy użyciu komórek dynamicznych. Jedynym problemem, jaki można napotkać, jest użycie komórek statycznych z kategoriami, typem separatora innym niż none i zgrupowanym stylem dla widoku tabeli. W rzeczywistości w tym konkretnym przypadku nie ukryje ostatniej komórki każdej kategorii. Aby temu zaradzić, rozwiązaniem, które znalazłem, było ustawienie separatora komórek (poprzez IB) na none, a następnie ręczne utworzenie (poprzez kod) widoku linii do każdej komórki. Na przykład sprawdź poniższy fragment:

/*
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)
    }
}
King-Wizard
źródło
W moim projekcie działa to na komórki statyczne, ale nie na dynamiczne. W tym drugim przypadku zawartość ostatniej komórki jest przesuwana w prawo (podobnie jak linia separatora). Wszelkie pomysły, dlaczego tak się dzieje?
Bastian
Pierwszy fragment powyższej odpowiedzi będzie działał na UITableView przy użyciu komórek dynamicznych. Jedynym problemem, jaki można napotkać, jest użycie komórek statycznych z kategoriami, typem separatora innym niż none i zgrupowanym stylem dla widoku tabeli. W rzeczywistości w tym konkretnym przypadku nie ukryje ostatniej komórki każdej kategorii. Aby temu zaradzić, rozwiązaniem, które znalazłem, było ustawienie separatora komórek (poprzez IB) na none, a następnie ręczne utworzenie (poprzez kod) widoku linii do każdej komórki. Na przykład sprawdź drugi fragment powyższej odpowiedzi.
King-Wizard
przesuwa tekst (tytuł), więc bezużyteczne!
user155
4

Użyj tej podklasy, zestaw separatorInsetnie działa na iOS 9.2.1, zawartość zostałaby ściśnięta.

@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
źródło
4

O wiele prostsze i logiczne jest wykonanie tego:

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

W większości przypadków nie chcesz widzieć tylko ostatniego separatora tableCiewCell. To podejście usuwa tylko ostatni separator tableViewCell i nie trzeba myśleć o problemach z automatycznym układaniem (tj. Obracającym się urządzeniem) lub wartościami kodu twardego, aby skonfigurować wstawki separatora.

Rostisławk
źródło
1
Witamy w Stack Overflow! Lepsza odpowiedź dla przyszłych czytelników wyjaśni, dlaczego jest to prostsze i bardziej logiczne.
CGritton,
fajne rozwiązanie!
geek1706,
3

W willdisplaycell:

cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
Kimate Richards
źródło
3

Korzystając ze Swift 3 i stosując najszybszą metodę hakowania, możesz poprawić kod za pomocą rozszerzeń :

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

}

Następnie podczas konfigurowania komórki:

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
źródło
2
  if([_data count] == 0 ){
       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];//  [self tableView].=YES;
    } else {
      [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];////    [self tableView].hidden=NO;
    }
Gank
źródło
2

Najlepszym sposobem na osiągnięcie tego jest wyłączenie domyślnych separatorów linii, podklasy UITableViewCelli dodanie niestandardowego separatora linii jako widoku podrzędnego contentView- patrz poniżej komórka niestandardowa, która służy do prezentacji obiektu typu, SNStockktóry ma dwie właściwości łańcucha, tickeroraz 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()
  } 
}

Aby wyłączyć użycie domyślnego separatora wiersza, tableView.separatorStyle = UITableViewCellSeparatorStyle.None;. Strona konsumenta jest stosunkowo prosta, patrz przykład poniżej:

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
źródło
2

W przypadku Swift 2:

dodaj następujący wiersz do viewDidLoad():

tableView.separatorColor = UIColor.clearColor()
Sebastian
źródło
2

jeśli zaakceptowana odpowiedź nie działa, możesz spróbować:

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

Wspaniale ;)

debiasej
źródło
1

Wypróbuj poniższy kod, który może pomóc rozwiązać problem

- (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
źródło
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
źródło
1

Musisz wziąć niestandardową komórkę i dodać Etykietę i ustawić ograniczenie, takie jak etykieta powinna obejmować cały obszar komórki. i napisz poniższy konstruktor.

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

Ustaw także margines układu UITableView w następujący sposób

tblSignup.layoutMargins = UIEdgeInsetsZero;
Coder_A_D
źródło
1

Nie mogłem ukryć separatora w określonej komórce, z wyjątkiem użycia następującego obejścia

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

W iOS7 i nowszych, czystszym sposobem jest użycie INFINITY zamiast wartości na stałe. Nie musisz się martwić aktualizacją komórki, gdy ekran się obraca.

if (indexPath.row == <row number>) {
    cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}
Xchord
źródło
3
Ostrzegamy: użycie INFINITY powoduje wyjątek czasu wykonywania na iOS9
AndrewR
1

Jak zauważyło (wiele) innych, możesz łatwo ukryć wszystkie separatory UITableViewCell, po prostu wyłączając je dla całego samego UITableView; np. w twoim UITableViewController

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

Niestety, to jest prawdziwa PITA do zrobienia na komórkę , o co tak naprawdę pytasz.

Osobiście próbowałem wielu permutacji zmiany cell.separatorInset.left, jak sugerują (wielu) inni, ale problemem jest cytowanie Apple (wyróżnienie dodane):

... Można wykorzystać tę właściwość, aby dodać przestrzeń między bieżącą komórką za treści i po lewej i prawej krawędzi stołu. Wartości wpuszczanym dodatnie przesuwają zawartość komórek i separator komórek wewnątrz i od krawędzi stole ...

Jeśli więc spróbujesz „ukryć” separator, odsuwając go poza ekran w prawo, możesz skończyć również wcięciem zawartości komórki. Jak sugeruje crifan, możesz następnie spróbować zrekompensować ten paskudny efekt uboczny poprzez ustawienie cell.indentationWidthi cell.indentationLevelodpowiednie cofnięcie wszystkiego, ale uważam, że jest to również niewiarygodne (treść wciąż się wcina ...).

Najbardziej niezawodny sposób, jaki znalazłem, to przesadzenie layoutSubviewsw prostej podklasie UITableViewCell i ustawienie prawej wstawki tak, aby uderzała w lewą wstawkę, dzięki czemu separator ma szerokość 0 i jest tak niewidoczny [należy to zrobić w widoku układu, aby automatycznie obroty uchwytu]. Dodam również metodę wygody do mojej podklasy, aby ją włączyć.

@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

Zastrzeżenie: nie ma niezawodnego sposobu na przywrócenie oryginalnej wstawki, więc nie można „odblokować” separatora, dlatego używam nieodwracalnej hideSeparatormetody (w przeciwieństwie do odsłonięcia separatoraIsHidden). Uwaga: separatorInset utrzymuje się w ponownie używanych komórkach, więc ponieważ nie możesz „odblokować”, musisz trzymać te komórki separatora ukryte w swoim własnym identyfikatorze ponownego użycia.

Tiritea
źródło
1

Moim wymaganiem było ukrycie separatora między 4. a 5. komórką. Osiągnąłem to przez

    -(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
źródło
1

Szybki:

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
}

Cel 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
źródło
1

Wewnątrz klasy komórek widoku tabeli. umieść te linie kodu

separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)
M.Nadeeshan
źródło
Nie uwzględnia zmian układu urządzenia / sceny.
Womble
0

Na iOS9 miałem problem z tym, że zmiana wstawek separatora wpływa również na położenie etykiety tekstowej i szczegółowej.

Rozwiązałem to dzięki temu

override func layoutSubviews() {
    super.layoutSubviews()

    separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}
Saren Inden
źródło
Nie działa z klasą UITableViewCell - TextLabel i DetailTextLabel oddalają się od komórki.
Nik Kov