C’è un modo per rendere le celle UITableView in iOS 7 non hanno un’interruzione di riga nel separatore?

Ho notato che in iOS 7, UITableViewCells ha un’interruzione di riga nel separatore della cella che iOS 6 non ha. C’è un modo per sbarazzarsi di questa interruzione di linea? La modifica del separatore su none e la creazione di UIViews con il colore del separatore causano comunque il separatore bianco a prescindere.

Per iOS7:

if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { [self.tableView setSeparatorInset:UIEdgeInsetsZero]; } 

Per iOS8:

Per prima cosa configura la tua vista tabella come segue:

 if ([self.tableView respondsToSelector:@selector(layoutMargins)]) { self.tableView.layoutMargins = UIEdgeInsetsZero; } 

Quindi nel tuo cellForRowAtIndexPath: metodo, configura la cella come segue:

 if ([cell respondsToSelector:@selector(layoutMargins)]) { cell.layoutMargins = UIEdgeInsetsZero; } 

Nota: includi sia layoutMargins che separatorInset , per supportare entrambe le versioni di iOS

Puoi anche impostare ” Separatore ” dallo storyboard:

inserisci la descrizione dell'immagine qui

inserisci la descrizione dell'immagine qui

Se si desidera supportare versioni precedenti di iOS, è necessario verificare la disponibilità di questo metodo prima di chiamarlo:

 if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { [self.tableView setSeparatorInset:UIEdgeInsetsZero]; } 

Capito.

 [self.tableView setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 0)]; 

La risposta selezionata non ha funzionato per me. Ma questo sì e funziona da iOS 2.0:

  [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; 

Versione rapida

iOS introduce la proprietà layoutMargins su celle E viste tabella.

Questa proprietà non è disponibile in iOS 7.0, quindi è necessario assicurarsi di controllare prima di assegnarlo!

Tuttavia, Apple ha aggiunto una proprietà ** alla tua cella che gli impedirà di ereditare le impostazioni dei margini della tua Vista tabella. In questo modo, le tue celle possono configurare i propri margini indipendentemente dalla vista tabella. Pensalo come un override.

Questa proprietà si chiama preservesSuperviewLayoutMargins e impostandola su NO può consentire di ignorare le impostazioni di layoutMargin della Vista tabella con l’impostazione di layout del mouse della propria cella. Risparmia tempo ( non è necessario modificare le impostazioni della Vista tabella ) ed è più conciso. Si prega di fare riferimento alla risposta di Mike Abdullah per una spiegazione dettagliata.

NOTA: questa è l’implementazione corretta e meno disordinata, come express nella risposta di Mike Abdullah; impostazione delle preservazioni della cellaSuperviewLayoutMargins = NO garantisce che la vista tabella non sostituisca le impostazioni della cella.

Primo passo: imposta i margini della tua cella:

 /* Tells the delegate the table view is about to draw a cell for a particular row. */ override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { // Remove seperator inset if cell.respondsToSelector("setSeparatorInset:") { cell.separatorInset = UIEdgeInsetsZero } // Prevent the cell from inheriting the Table View's margin settings if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") { cell.preservesSuperviewLayoutMargins = false } // Explictly set your cell's layout margins if cell.respondsToSelector("setLayoutMargins:") { cell.layoutMargins = UIEdgeInsetsZero } } 

L’impostazione della proprietà preservesSuperviewLayoutMargins sulla tua cella su NO dovrebbe impedire alla vista tabella di ignorare i margini della cella. In alcuni casi, sembra non funzionare correttamente.

Secondo passaggio: solo se tutto fallisce, puoi forzare la forza bruta sui margini della vista tabella:

 /* Called to notify the view controller that its view has just laid out its subviews. */ override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() // Force your tableview margins (this may be a bad idea) if self.tableView.respondsToSelector("setSeparatorInset:") { self.tableView.separatorInset = UIEdgeInsetsZero } if self.tableView.respondsToSelector("setLayoutMargins:") { self.tableView.layoutMargins = UIEdgeInsetsZero } } 

… e ci sei! Questo dovrebbe funzionare su iOS 8 e iOS 7.

Nota: testato usando iOS 8.1 e 7.1, nel mio caso ho solo bisogno di usare Il primo passo di questa spiegazione.

Il Secondo Passo è richiesto solo se hai una cella non popolata sotto le celle renderizzate, es. se la tabella è più grande del numero di righe nel modello di tabella. Se non si esegue la seconda fase, si otterrebbero offset di separatori diversi.

Per una soluzione permanente per l’intera applicazione, chiamala nell’applicazione: didFinishLaunching .. qualsiasi tableview sarà “corretta”

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { [[UITableView appearance]setSeparatorInset:UIEdgeInsetsZero]; } 

E in iOS 8, basato sul post di Seth McFarlane, devi iniziare a occuparti di layoutMargins. Quanto segue ha fatto per me:

  1. In ApplicationDidFinishLaunching, eseguire quanto segue:

     if ([UITableViewCell instancesRespondToSelector:@selector(setLayoutMargins:)]) { [[UITableViewCell appearance]setLayoutMargins:UIEdgeInsetsZero]; } 
  2. Creare la seguente categoria su UITableView:

     @interface UITableView(WJAdditions) -(void) wjZeroSeparatorInset; @end @implementation UITableView (WJAdditions) -(void) wjZeroSeparatorInset { #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 if ([self respondsToSelector:@selector(setLayoutMargins:)]) { self.layoutMargins = UIEdgeInsetsZero; } #endif #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 if ([self respondsToSelector: @selector(setSeparatorInset:)]) self.separatorInset = UIEdgeInsetsZero; } #endif } @end 
  3. Nella tua UITableViews, poco dopo l’inizializzazione, chiama

     [self wjZeroSeparatorInset]; 
  4. Nei tuoi UITableViewControllers, hai bisogno di quanto segue:

     -(void) viewWillLayoutSubviews { [super viewWillLayoutSubviews]; UITableView* tv = self.tableView; if ([tv respondsToSelector:@selector(setLayoutMargins:)]) { [tv setLayoutMargins:UIEdgeInsetsZero]; } } 

In iOS 8, sembra esserci un piccolo bug. Il valore personalizzato per il separatore non viene applicato alle celle con testo al suo interno. Ho provato a impostarlo dal builder dell’interfaccia e tramite il codice, ma nessuno dei due ha funzionato. Ho anche presentato una segnalazione di errore.

inserisci la descrizione dell'immagine qui

Nel frattempo, ho una piccola soluzione per raggiungere questo objective. Ho semplicemente disegnato la linea sulla cella. Creare una sottoclass di UITableViewCell e sovrascrivere il metodo drawRect . Inoltre, non dimenticare di impostare la proprietà separator di UITableView su None. Ecco il codice. È in Swift ma poiché è fondamentalmente C, puoi usare la stessa cosa anche in Objective-C.

 override func drawRect(rect: CGRect) { super.drawRect(rect) let context = UIGraphicsGetCurrentContext() CGContextSetStrokeColorWithColor(context, UITableView().separatorColor.CGColor) // seperator color CGContextSetLineWidth(context, 2) // separator width CGContextMoveToPoint(context, 0, self.bounds.size.height) CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height) CGContextStrokePath(context) } 

Reset separatorInset risolve questo problema per me:

 if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { [self.tableView setSeparatorInset:self.tableView.separatorInset]; } 

La soluzione:

 -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{ if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) { [tableView setSeparatorInset:UIEdgeInsetsZero]; } if ([tableView respondsToSelector:@selector(setLayoutMargins:)]) { [tableView setLayoutMargins:UIEdgeInsetsZero]; } if ([cell respondsToSelector:@selector(setLayoutMargins:)]) { [cell setLayoutMargins:UIEdgeInsetsZero]; } } 

Attenzione come impostare il separatorInset di tableView su UIEdgeInsetsZero sembra spezzare il margine sinistro dei titoli delle sezioni allo stesso tempo! (almeno lo fa su iOS 7.1)

Se si desidera visualizzare i titoli delle sezioni con tableView: titleForHeaderInSection: e ottenere comunque l’effetto desiderato di nessuna interruzione di riga tra UITableViewCells, è necessario impostare separatorInset direttamente sulle celle anziché su tableView!

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { // ... [cell setSeparatorInset:UIEdgeInsetsZero]; 

Per iOS8 + questo ha funzionato per me,

 tableView.layoutMargins = UIEdgeInsetsZero 

e nel metodo cellForRowAtIndexPath :

 cell.layoutMargins = UIEdgeInsetsZero; 
 - (void)viewDidLoad { [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; [super viewDidLoad]; // Additional setup } 

Nota: la linea setSeparatorStyle deve essere al di sopra della super chiamata.

 @implementation UITableView (HGApperance) -(void)setSeparatorXMargin:(CGFloat)margin{ // iOS 7 if ([self respondsToSelector:@selector(setSeparatorInset:)]) { [self setSeparatorInset:UIEdgeInsetsZero]; } if ([self respondsToSelector:@selector(layoutMargins)]) { self.layoutMargins = UIEdgeInsetsZero; } } @end 

Per TableviewCell, la risposta di Willam funziona perfettamente.

Per iOS8 e versioni successive

Se scopri che tutte le soluzioni non funzionano come me, penso che potresti aver utilizzato la sottoclass di UITableViewCell e aver sovrascritto il metodo layoutSubviews , se hai soddisfatto due condizioni, continua a leggere.

Fai o controllalo passo dopo passo.

1, dopo aver assegnato e avviato UITableView , impostare la proprietà layoutMargins .

 if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) { _tableView.layoutMargins = UIEdgeInsetsZero ; } 

2, Nel metodo - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath , dopo l’allocazione e l’inizializzazione del proprio UITableViewCell personalizzato, impostare la proprietà layoutMargins .

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

3, La parte più importante arriva. Se si sostituisce il metodo - (void)layoutSubviews di UITableViewCell, non dimenticare di chiamare il suo super .

 - (void)layoutSubviews { [super layoutSubviews] ; // layout the subviews } 

Xamarin.iOS Versione

Ho esteso il separatore di UITableView per tutta la larghezza in Xamarin.iOS su iOS 8.4 con l’aiuto dei post di Luis E. Prado e King-Wizard . Ho dovuto impostare sia SeparatorInset che LayoutMargins per farlo funzionare. Non ho scritto assegni per versioni iOS ridotte poiché ho scelto iOS 8 e versioni successive.

Ho scritto i seguenti due metodi di estensione C # per impostare il separatore di UITableView a larghezza intera sul livello UITableView o UITableViewCell. È ansible utilizzare uno o entrambi questi metodi a seconda dell’effetto desiderato (vedere le spiegazioni di seguito).

UITableView

Impostare le proprietà di UITableView per modificare i separatori visualizzati dopo le celle vuote. Questo metodo SetLayoutMarginsZero può essere chiamato dal metodo ViewDidLoad di ViewController correlato.

 public static void SetLayoutMarginsZero(this UITableView tableView) { tableView.SeparatorInset = UIEdgeInsets.Zero; tableView.LayoutMargins = UIEdgeInsets.Zero; } 

UITableViewCell

Impostare le proprietà UITableViewCell per modificare i separatori visualizzati dopo le celle popolate. Questo metodo SetLayoutMarginsZero può essere chiamato dal metodo GetCell di TableViewSource.

 public static void SetLayoutMarginsZero(this UITableViewCell tableViewCell) { tableViewCell.SeparatorInset = UIEdgeInsets.Zero; tableViewCell.LayoutMargins = UIEdgeInsets.Zero; tableViewCell.PreservesSuperviewLayoutMargins = false; }