Nasconde la linea di separazione su un UITableViewCell


250

Sto personalizzando un UITableView. Voglio nascondere la linea di separazione sull'ultima cella ... posso farlo?

So di poterlo fare tableView.separatorStyle = UITableViewCellStyle.Nonema ciò influirebbe su tutte le celle di tableView. Voglio che influisca solo sulla mia ultima cella.



La tua domanda ha risposto alla mia. tableView.separatorStyle = UITableViewCellStyle.Non era la linea di cui avevo bisogno
Malachi Holden

Risposte:


371

in viewDidLoad, aggiungi questa riga:

self.tableView.separatorColor = [UIColor clearColor];

e in cellForRowAtIndexPath:

per le versioni precedenti di 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];
}

per iOS 7 versioni superiori (incluso iOS 8)

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

4
Funzionerà su iOS7 e iOS8. Riduce efficacemente il separatore a zero. cell.separatorInset = UIEdgeInsetsMake (0, CGRectGetWidth (cell.bounds) /2.0, 0, CGRectGetWidth (cell.bounds) /2.0)
Harris,

9
Un promemoria: quando iDevice è iPad e la cella viene utilizzata AutoLayout, il valore restituito da "cell.bounds.size.width" potrebbe non essere uguale alla larghezza effettiva della cella. Quindi uso sempre "tableView.frame.size.width" invece di "cell.bounds.size.width".
Veight Zhou

5
Nota: utilizzare [cell.contentView addSubview:line]invece di[cell addSubview:line]
Anastasia

6
change cell.separatorInset inserto sinistro cambierà anche l'inserto sinistro del contenuto della cella. Non solo la linea di separazione. Da apple doc: "Puoi usare questa proprietà per aggiungere spazio tra il contenuto della cella corrente e i bordi sinistro e destro della tabella. I valori di inserto positivi spostano il contenuto e il separatore di celle verso l'interno e lontano dai bordi della tabella."
zgjie,

9
Cattiva idea. Non aggiungere mai visualizzazioni secondarie a una cella in cellForRowAtIndexPath. Ricorda che le cellule vengono riutilizzate. Ogni volta che questa cella viene riutilizzata, aggiungi un'altra vista della linea di separazione. Su elenchi di grandi dimensioni ciò può influire sulle prestazioni di scorrimento. E non è solo il modo giusto per farlo.
Dave Batton,

247

Puoi usare il seguente codice:

Veloce:

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

o :

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

per margine predefinito:

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

per mostrare il separatore end-to-end

cell.separatorInset = .zero

Objective-C:

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

Non funziona per un gruppo UITableView, mentre la risposta accettata funziona.
Aleks N.

3
Questo non funziona per iOS9, self.tableView.separatorColor = [UIColor clearColor];risolto.
Ben

1
È un trucco completo ma ciò che funziona in iOS 9 è: cell.layoutMargins = UIEdgeInsetsZero; cell.separatorInset = UIEdgeInsetsMake (0, 0, 0, 9999)
Pat Niemeyer,

Questo è il modo in cui funziona per me in iOS 8+: cell.separatorInset = UIEdgeInsetsMake(0.f, 0.f, 0.f, cell.bounds.size.width-cell.layoutMargins.left);se non sottraggo il valore cell.layoutMargins.left, la linea di separazione viene disegnata dal bordo sinistro al margine sinistro (se ne hai).
Alexandre OS,

3
Questo spinge qualsiasi textLabeloff-screen.
aehlke,

99

Per dare seguito a Hiren la risposta di .

in ViewDidLoad e la seguente riga:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

Oppure, se stai usando XIB o Storyboard cambia " separator " in " none ":

Builder di interfaccia

E in CellForRowAtIndexPath aggiungi questo:

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

Ecco un esempio del risultato in cui visualizzo una vista tabella con celle dinamiche (ma ne ho solo una con contenuti). Il risultato è che solo quello ha un separatore e non tutti quelli "fittizi" vengono aggiunti automaticamente alla schermata.

inserisci qui la descrizione dell'immagine

Spero che questo ti aiuti.

EDIT: per coloro che non leggono sempre i commenti, in realtà c'è un modo migliore per farlo con poche righe di codice:

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

Penso che, per nascondere la linea di separazione, questo sia l'approccio giusto. self.tableView.separatorStyle = .none
arango_86

52

Se non vuoi disegnare tu stesso il separatore, usa questo:

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

Questa API è disponibile solo a partire da iOS 7.


8
separatorInsetsembra inserire il contenuto della cella e il separatore, richiedendo un altro hack per compensare:cell.IndentationWidth = -10000;
crishoj

23
Un metodo migliore consiste nell'impostare separatorInsetsu 0 per la parte superiore, sinistra e inferiore e la larghezza della cella per destra: cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, cell.bounds.size.width); questo evita la necessità di regolare qualsiasi altra proprietà della cella.
bryguy1300,

Se stai utilizzando la larghezza dei limiti di cella per l'inser, potresti dover ricalcolare quando l'interfaccia ruota.
AndrewR,

Si noti che se la cella in cui si fa ciò viene riutilizzata per disegnare un'altra cella per la quale non si intendeva nascondere il separatore, anche il separatore sparirà da esso.
Michael Peterson,

1
UIEdgeInsetsMake (0, 10000, 0, 0); lavorato -> UIEdgeInsetsMake (0, 0, 0, cell.bounds.size.width); no. Immagino che sia perché ho la brutta abitudine di mantenere vcs di dimensioni 3,5 "in xib e pannelli di stile che gli artefatti su dispositivi da 4" + causano resti di sezioni 375-320px = 55px. (con voce yoda) e molto brutto lo è!
Anton Tropashko,

29

il mio ambiente di sviluppo è

  • Xcode 7.0
  • 7A220 Swift 2.0
  • iOS 9.0

le risposte sopra non funzionano completamente per me

dopo aver provato, la mia soluzione finalmente funzionante è:

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

e l'effetto è: inserisci qui la descrizione dell'immagine


20

Imposta separatorInset.right = .greatestFiniteMagnitudesul tuo cellulare.


la chiamata su questo awakeFromNibpuò far lampeggiare l'intero schermoapplicationDidBecomeActive
Breadbin,

Funziona su iOS 12.2, sul dispositivo, dalla creazione programmatica di UITableViewCell. Bello.
Womble,

L'impostazione del separatore corretto ha funzionato per me quando lo sto impostando in cellForRowAt. Le migliori soluzioni Funziona da iOS 10 a 13 per me. Testato su iOS 10, 12 e 13. Quando è impostato il margine sinistro, allora non funziona per iOS 10.
Ariel Bogdziewicz

18

In Swift 3, Swift 4 e Swift 5 , puoi scrivere un'estensione su UITableViewCell in questo modo:

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

Quindi puoi usarlo come di seguito (quando cell è la tua istanza di cellulare):

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

È davvero meglio assegnare la larghezza della cella della vista tabella come inserto a sinistra invece di assegnarle un numero casuale. Perché in alcune dimensioni dello schermo, forse non ora, ma in futuro i tuoi separatori possono essere ancora visibili perché quel numero casuale potrebbe non essere sufficiente. Inoltre, in iPad in modalità orizzontale non puoi garantire che i tuoi separatori siano sempre invisibili.


Questo non funziona con UITableView in stile raggruppato. Hai una soluzione per caso raggruppato?
zslavman,

8

Migliore soluzione per iOS 7 e 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);
    }
}

Se la tua app è ruotabile, usa 3000.0f per la costante di inserimento a sinistra o calcola al volo. Se provi a impostare l'inserzione a destra hai parte visibile del separatore sul lato sinistro della cella su iOS 8.


1
Perché usare un numero casuale quando potresti fare qualcosa del genere: MAX ([[UIScreen mainScreen] bounds] .size.width, [[UIScreen mainScreen] bounds] .size.height); per assicurarsi che sia sempre andato
Daniel Galasko,

7

In iOS 7, il separatore di celle in stile raggruppato UITableView ha un aspetto leggermente diverso. Sembra un po 'così:

inserisci qui la descrizione dell'immagine

Ho provato la risposta di Kemenaran di fare questo:

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

Tuttavia, questo non sembra funzionare per me. Non sono sicuro del perché. Quindi ho deciso di usare la risposta di Hiren , ma usando UIViewinvece di UIImageView, e traccia la linea nello stile di 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];
}

Se lo usi, assicurati di inserire l'altezza della vista tabella corretta nella seconda istruzione if. Spero che questo sia utile per qualcuno.


7

Nella sottoclasse UITableViewCell, sovrascrivi layoutSubviews e nascondi _UITableViewCellSeparatorView. Funziona con iOS 10.

override func layoutSubviews() {
    super.layoutSubviews()

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

nessuna delle soluzioni di cui sopra ha funzionato, funziona su iOS 12
Abdul Waheed,

Questo potrebbe essere rifiutato dall'App Store per l'accesso alle API private.
Elliot Fiske

5

Non credo che questo approccio funzionerà in nessun caso con celle dinamiche ...

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

Non importa in quale metodo tableview lo usi per le celle dinamiche, la cella in cui hai modificato la proprietà inset avrà sempre la proprietà inset impostata ora ogni volta che viene rimossa la coda causando una furia di separatori di riga mancanti ... Questo fino a quando cambiarlo tu stesso.

Qualcosa del genere ha funzionato per me:

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

In questo modo aggiorni lo stato della tua struttura dati ad ogni carico


4

In Swift con 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)
    }
}

Nota: questo frammento sopra funzionerà su UITableView usando celle dinamiche. L'unico problema che si può verificare è quando si utilizzano celle statiche con categorie, un tipo di separatore diverso da nessuno e uno stile raggruppato per la vista tabella. In effetti, in questo caso particolare non nasconderà l'ultima cella di ogni categoria. Per ovviare a questo, la soluzione che ho trovato era di impostare il separatore di celle (tramite IB) su nessuno e quindi di creare e aggiungere manualmente (tramite codice) la visualizzazione della linea a ciascuna cella. Per un esempio, controlla lo snippet di seguito:

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

Nel mio progetto, questo funziona per celle statiche ma non per celle dinamiche. In quest'ultimo caso, il contenuto dell'ultima cella viene spostato a destra (proprio come la linea di separazione). Qualche idea, perché questo potrebbe accadere?
Bastian,

Il primo frammento della risposta sopra funzionerà su UITableView usando celle dinamiche. L'unico problema che si può riscontrare è quando si utilizzano celle statiche con categorie, un tipo di separatore diverso da nessuno e uno stile raggruppato per la vista tabella. In effetti, in questo caso particolare non nasconderà l'ultima cella di ogni categoria. Per ovviare a questo, la soluzione che ho trovato era di impostare il separatore di celle (tramite IB) su nessuno e quindi di creare e aggiungere manualmente (tramite codice) la visualizzazione della linea a ciascuna cella. Per un esempio, controlla il secondo frammento della risposta sopra.
King-Wizard

sposta il testo (titolo), così inutile!
user155

4

Utilizzare questa sottoclasse, il set separatorInsetnon funziona per iOS 9.2.1, il contenuto verrebbe compresso.

@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

Il molto più semplice e logico è fare questo:

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

Nella maggior parte dei casi non si desidera visualizzare solo l'ultimo separatore tableCiewCell. E questo approccio rimuove solo l'ultimo separatore tableViewCell e non è necessario pensare a problemi di autolayout (ovvero dispositivo rotante) o valori hardcode per impostare gli inserti del separatore.


1
Benvenuto in Stack Overflow! Una risposta migliore per i futuri lettori spiegherebbe perché questo è più semplice e più logico.
CGritton,

una bella soluzione!
geek1706,

3

In willdisplaycell:

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

3

Utilizzando Swift 3 e adottando il metodo di hacking più veloce, puoi migliorare il codice usando le estensioni :

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

}

Quindi, quando si configura la cella:

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

Il modo migliore per raggiungere questo obiettivo è disattivare i separatori di linea predefiniti, la sottoclasse UITableViewCelle aggiungere un separatore di linea personalizzato come sottoview di contentView- vedi sotto una cella personalizzata che viene utilizzata per presentare un oggetto di tipo SNStockche ha due proprietà di stringa tickere 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()
  } 
}

Per disattivare l'utilizzo separatore linea predefinita, tableView.separatorStyle = UITableViewCellSeparatorStyle.None;. Il lato consumatore è relativamente semplice, vedi esempio sotto:

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

Per Swift 2:

aggiungi la seguente riga a viewDidLoad():

tableView.separatorColor = UIColor.clearColor()

2

se la risposta accettata non funziona, puoi provare questo:

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

È ottimo ;)


1

Prova il codice seguente, potrebbe aiutarti a risolvere il tuo problema

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

Devi prendere una cella personalizzata e aggiungere un'etichetta e impostare un vincolo come un'etichetta che dovrebbe coprire l'intera area della cella. e scrivi la riga sotto nel costruttore.

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

Impostare anche il margine del layout UITableView come segue

tblSignup.layoutMargins = UIEdgeInsetsZero;

1

Non riuscivo a nascondere il separatore su una cella specifica se non utilizzando la seguente soluzione alternativa

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

1

Per iOS7 e versioni successive, il modo più pulito è utilizzare INFINITY anziché il valore hardcoded. Non devi preoccuparti di aggiornare la cella quando lo schermo ruota.

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

3
Attenzione: l'utilizzo di INFINITY provoca un'eccezione di runtime su iOS9
AndrewR

1

Come (molti) altri hanno sottolineato, è possibile nascondere facilmente tutti i separatori UITableViewCell semplicemente disattivandoli per l'intero UITableView stesso; ad es. nel tuo UITableViewController

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

Sfortunatamente, è un vero PITA da fare su una cellula base , che è quello che stai davvero chiedendo.

Personalmente, ho provato numerose permutazioni di modifica di cell.separatorInset.left , di nuovo, come (molti) altri hanno suggerito, ma il problema è, per citare Apple (enfasi aggiunta):

" ... È possibile utilizzare questa proprietà per aggiungere spazio tra il contenuto della cella corrente e i bordi sinistro e destro della tabella. I valori di inserimento positivi spostano il contenuto della cella e il separatore di celle verso l'interno e lontano dai bordi della tabella ... "

Quindi, se provi a 'nascondere' il separatore spingendolo fuori dallo schermo a destra, puoi anche rientrare nel rientro del contenuto della tua cella. Come suggerito da Crifan, puoi quindi provare a compensare questo brutto effetto collaterale impostando cell.indentationWidthecell.indentationLevel appropriato spostare tutto indietro, ma ho trovato che anche questo è inaffidabile (il contenuto è ancora indentato ...).

Il modo più affidabile che ho trovato è di scavalcare layoutSubviewsin una semplice sottoclasse UITableViewCell e impostare l' inserzione giusta in modo che colpisca l'inserzione sinistra, rendendo il separatore con larghezza 0 e così invisibile [questo deve essere fatto in layout gestire le rotazioni]. Aggiungo anche un metodo di praticità alla mia sottoclasse per attivarlo.

@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

Avvertenza: non esiste un modo affidabile per ripristinare l' inserto destro originale , quindi non è possibile "nascondere" il separatore, quindi perché sto usando un hideSeparatormetodo irreversibile (rispetto all'esposizione di separatorIsHidden). Notare che il separatorInset persiste tra le celle riutilizzate, quindi, poiché non è possibile "nascondere", è necessario mantenere queste celle con separatore nascosto isolate nel proprio ID riutilizzo.


1

Il mio requisito era nascondere il separatore tra la quarta e la quinta cella. L'ho raggiunto da

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

All'interno della classe di celle tableview. inserisci questa riga di codice

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

Non tiene conto delle modifiche al layout del dispositivo / scena.
Womble,

0

Su iOS9 ho avuto il problema che la modifica degli inserti di separazione influisce anche sul posizionamento dell'etichetta di testo e dettaglio.

L'ho risolto con questo

override func layoutSubviews() {
    super.layoutSubviews()

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

Non funziona con la classe UITableViewCell - TextLabel e DetailTextLabel si allontanano dalla cella.
Nik Kov,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.