2015-07-01 1 views
20

Sto provando a rimuovere il separatore per uno UITableViewCell. Ho fatto la seguente:Rimuovere la linea di separazione per una sola cella

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell; 
    cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; 

    if (indexPath.row == 1) 
     cell.separatorInset = UIEdgeInsetsZero; 

    return cell; 
} 

(E 'static cells.) Quando eseguo l'applicazione. La linea di separazione è ancora lì. Come posso rimuovere la linea di separazione per uno cell?

+0

Impostazione separatorInset a UIEdgeInsetsZero è quello di mostra il separatore con da sinistra a destra. Vuoi nascondere il separatoreInset solo alla riga indice 1? – thanyaj

+0

Sì. Sto cercando di nascondere il separatore all'indice di riga 1 – Jessica

+0

rimuovendo solo 1 separatore sulla cella è complicato perché si ottiene o tutti gli seperator o nessuno. Di solito ho implementato la mia vista separatore che è solo un utente con 1 pixel di altezza. Quindi, progetta per mostrare e nascondere la vista separatore. Potrebbero esserci alcune idee migliori. che sono desideroso di apprenderci bene – thanyaj

risposta

18

Su iOS 8 è necessario utilizzare:

cell.layoutMargins = UIEdgeInsetsZero 

Se si vuole essere compatibile con iOS 7 e si dovrebbe fare seguente:

if ([cell respondsToSelector:@selector(setSeparatorInset:)]) { 
    [cell setSeparatorInset:UIEdgeInsetsZero]; 
} 

if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { 
    [cell setLayoutMargins:UIEdgeInsetsZero]; 
} 

ADD: Se didn precedente' t lavoro - usa questo. (Da risposta qui sotto)

cell.separatorInset = UIEdgeInsetsMake(0, 1000, 0, 0); 
+0

Il secondo metodo supporta anche iOS 8? – Jessica

+0

il primo è per iOS 7 e inferiore, il secondo è per iOS 8. Devi inserire entrambi nella tua app, quindi eseguirà il codice corretto per la data versione iOS –

+0

(Nella risposta che hai scritto il primo è per io8.) Devo avere una dichiarazione if per supportare entrambe le versioni? – Jessica

0

Un altro modo che è un po 'hacky è quello di creare la cella di vista tabella personalizzata con un'UIView che agisce come separatore inserto. Quindi, nascondilo e mostralo quando vuoi.

ho creato SampleTableViewCell e un file pennino con etichetta e separatorLineView

@interface SampleTableViewCell : UITableViewCell 
@property (weak, nonatomic) IBOutlet UILabel *titleLabel; 
@property (weak, nonatomic) IBOutlet UIView *separatorLineView; 
@end 

Poi, in ViewController classe

@interface ViewController() 
@property (nonatomic) NSArray *items; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.items = @[@"A", @"B", @"C"]; 
    [self.tableView registerNib:[UINib nibWithNibName:@"SampleTableViewCell" bundle:nil] forCellReuseIdentifier:@"SampleCell"]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    SampleTableViewCell *cell = (SampleTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"SampleCell" forIndexPath:indexPath]; 
    cell.titleLabel.text = self.items[indexPath.row]; 
    if (indexPath.row == 1) { 
     cell.separatorLineView.hidden = YES; 
    } else { 
     cell.separatorLineView.hidden = NO; 
    } 
    return cell; 
} 

@end 
13

Hai appena può nascondere visivamente separatore attraverso separatorInset proprietà:

tableViewCell.separatorInset = UIEdgeInsets(top: 0, left: 10000, bottom: 0, right: 0) 
+0

Soluzione piacevole! –

+0

Soluzione pazzesca. –

1

Per quelle persone alle prese con questo iOS 9 la soluzione è leggermente diversa dalle risposte già date. Ecco come ho risolto a Swift:

override func viewWillAppear(animated: Bool) { 
    table.cellLayoutMarginsFollowReadableWidth = false 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    if IS_THE_CELL_WITH_NO_SEPARATOR{ 
     cell.separatorInset = UIEdgeInsetsZero 
     cell.preservesSuperviewLayoutMargins = false 
     cell.layoutMargins = UIEdgeInsetsZero 
    } 
} 

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    if IS_THE_CELL_WITH_NO_SEPARATOR{ 
     let size = self.view.bounds.size 
     let rightInset = size.width > size.height ? size.width : size.height 
     cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, rightInset) 
    } 
} 
5

Se si desidera nascondere la linea di separazione solo per un tipo specifico di cellule, è possibile utilizzare il seguente codice:

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

scrivere questo codice in la cella (deve essere una sottoclasse di UITableViewCell) per la quale non si desidera visualizzare una linea di separazione.

+2

Ho provato un sacco di altre soluzioni e questo è diventato il meno hacky. In Swift 3.0, questa è la sintassi corretta: 'subviews.forEach {vista in se il tipo (di: view) .description() == "_UITableViewCellSeparatorView"{ view.isHidden = true }} ' – gokeji

+2

Hackiest di le soluzioni. Avviso –

+0

- questo causa problemi in iOS 10. iOS sembra clonare le proprietà del separatore tra istanze di cella e classi di celle completamente diverse su tabelle diverse iniziano ad apparire senza separatori. –

1
cell.separatorInset = UIEdgeInsetsMake(0.0 , cell.bounds.size.width , 0.0, -cell.bounds.size.width) 
+1

Anche se questo può rispondere alla domanda, alcuni contesto e/o spiegazione sarebbero carini. Anche per i futuri lettori. – VDWWD

-5

Swift 3 separatore Rimuovere tutte cella:

override func viewDidLoad() { 
     self.yourTableView.separatorStyle = UITableViewCellSeparatorStyle.none 
    } 
+0

Utilizzare il collegamento [modifica] per spiegare come funziona questo codice e non solo fornire il codice, poiché una spiegazione è più probabile che aiuti i futuri lettori. Vedi anche [risposta]. [fonte] (http://stackoverflow.com/users/5244995) –

+0

Ancora più importante, questa risposta non risponde alla domanda posta. Questo codice disabilita semplicemente i separatori sull'intera tabella; non in modo selettivo su una singola cella alla volta. – SimplePanda

2

basta aggiungere in seguito alla cella non si vuole separatore (swift 3):

override func awakeFromNib() { 
    super.awakeFromNib() 

    // remove separator 
    self.separatorInset = UIEdgeInsetsMake(0, 1000, 0, 0) 
}