Existe-t-il un moyen de faire en sorte que les cellules UITableView d’iOS 7 ne présentent pas de saut de ligne dans le séparateur?

J’ai remarqué que dans iOS 7, UITableViewCells avait un saut de ligne dans le séparateur de la cellule que iOS 6 ne possède pas. Y a-t-il un moyen de se débarrasser de ce saut de ligne? Si vous modifiez le séparateur à zéro et que vous créez des UIViews avec la couleur du séparateur, le séparateur blanc se produit malgré tout.

Pour iOS7:

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

Pour iOS8:

Configurez d’abord votre tableau comme suit:

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

Ensuite, dans votre méthode cellForRowAtIndexPath: configurez la cellule comme suit:

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

Remarque: Incluez layoutMargins et separatorInset , pour prendre en charge les deux versions d’iOS

Vous pouvez également définir le séparateur dans le storyboard:

entrer la description de l'image ici

entrer la description de l'image ici

Si vous souhaitez prendre en charge d’anciennes versions d’iOS, vous devez vérifier la disponibilité de cette méthode avant de l’appeler:

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

Deviner.

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

La réponse sélectionnée n’a pas fonctionné pour moi. Mais cela oui et ça marche depuis ios 2.0:

  [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone]; 

Version rapide

iOS introduit la propriété layoutMargins sur les cellules et les vues de table.

Cette propriété n’est pas disponible dans iOS 7.0, vous devez donc vous assurer de vérifier avant de l’atsortingbuer!

Cependant, Apple a ajouté une propriété ** à votre cellule pour l’empêcher d’hériter des parameters de marge de la vue Table. De cette façon, vos cellules peuvent configurer leurs propres marges indépendamment de la vue de la table. Pensez-y comme un remplacement.

Cette propriété est appelée preserveesSuperviewLayoutMargins et sa définition sur NO peut vous permettre de remplacer les parameters layoutMargin de votre vue Table par le paramètre layoutMargin de votre propre cellule. Cela permet de gagner du temps ( vous n’avez pas à modifier les parameters de la vue de table ) et est plus concis. Veuillez vous reporter à la réponse de Mike Abdullah pour une explication détaillée.

NOTE: il s’agit de l’implémentation correcte, moins compliquée, telle qu’elle est exprimée dans la réponse de Mike Abdullah; Si vous définissez conservesSuperviewLayoutMargins = NO, votre vue de table ne remplacera pas les parameters de cellule.

Première étape – Configurez les marges de votre cellule:

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

La définition de la propriété preserveesSuperviewLayoutMargins sur votre cellule sur NO doit empêcher votre vue de table de remplacer vos marges de cellule. Dans certains cas, il semble ne pas fonctionner correctement.

Deuxième étape – Seulement si tout échoue, vous pouvez forcer les marges de la vue Table:

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

… et voilà! Cela devrait fonctionner sur iOS 8 et iOS 7.

Note: testé avec iOS 8.1 et 7.1, dans mon cas, je n’avais besoin que de la première étape de cette explication.

La deuxième étape est requirejse uniquement si vous avez une cellule non renseignée sous les cellules rendues, c.-à-d. si la table est plus grande que le nombre de lignes du modèle de table. Ne pas effectuer la deuxième étape entraînerait des décalages de séparateur différents.

Pour une solution permanente à l’échelle de l’application, appelez ceci dans l’application: didFinishLaunching .. toute tableview sera “corrigée”

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

Et dans iOS 8, basé sur le post Seth McFarlane ici , vous devez commencer à traiter avec layoutMargins. Ce qui suit l’a fait pour moi:

  1. Dans ApplicationDidFinishLaunching, exécutez les opérations suivantes:

     if ([UITableViewCell instancesRespondToSelector:@selector(setLayoutMargins:)]) { [[UITableViewCell appearance]setLayoutMargins:UIEdgeInsetsZero]; } 
  2. Créez la catégorie suivante sur 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. Dans vos UITableViews, peu de temps après l’initialisation, appelez

     [self wjZeroSeparatorInset]; 
  4. Dans vos UITableViewControllers, vous avez besoin des éléments suivants:

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

Dans iOS 8, il semble y avoir un petit bogue. La valeur personnalisée du séparateur n’est pas appliquée aux cellules contenant du texte. J’ai essayé de le configurer à partir du générateur d’interface et par le biais du code, mais aucune n’a fonctionné. J’ai également déposé un rapport de bogue.

entrer la description de l'image ici

En attendant, j’ai une petite solution pour y parvenir. Je dessine simplement la ligne sur la cellule. Créez une sous-classe de UITableViewCell et remplacez la méthode drawRect . N’oubliez pas non plus de définir la propriété separator de UITableView sur None. Voici le code C’est dans Swift mais depuis son C, vous pouvez utiliser la même chose dans 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) } 

Réinitialiser separatorInset résout ce problème pour moi:

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

La solution:

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

Attention, la définition de separatorInset de tableView sur UIEdgeInsetsZero semble casser la marge gauche des titres de section en même temps! (du moins sur iOS 7.1)

Si vous souhaitez afficher les titres de section avec tableView: titleForHeaderInSection: et que vous obtenez toujours l’effet de désirer aucun saut de ligne entre UITableViewCells, vous devez définir le separatorInset directement sur les cellules au lieu de tableView!

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

Pour iOS8 +, cela a fonctionné pour moi,

 tableView.layoutMargins = UIEdgeInsetsZero 

et dans la méthode cellForRowAtIndexPath :

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

Note: la ligne setSeparatorStyle doit être au dessus du super appel.

 @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 

Pour TableviewCell, la réponse de Willam fonctionne parfaitement.

Pour iOS8 et supérieur

Si vous trouvez que toutes les solutions ne fonctionnent pas comme moi, je pense que vous avez peut-être utilisé la sous-classe de UITableViewCell et layoutSubviews méthode layoutSubviews , si vous remplissez deux conditions, continuez à lire.

Faites-le ou vérifiez-le pas à pas.

1 alloc Après alloc et init, UITableView , définissez sa propriété layoutMargins .

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

2 、 Dans la méthode - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath , après alloc et init votre UITableViewCell personnalisé, définissez sa propriété layoutMargins .

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

3 part La partie la plus importante entre en jeu. Si vous remplacez la méthode - (void)layoutSubviews de UITableViewCell, n’oubliez pas d’appeler son super .

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

Version Xamarin.iOS

J’ai étendu le séparateur UITableView sur toute la largeur de Xamarin.iOS sur iOS 8.4 avec l’aide des articles de Luis E. Prado et de King-Wizard . Je devais définir SeparatorInset et LayoutMargins pour le faire fonctionner. Je n’ai pas écrit de chèques pour les versions iOS inférieures puisque je cible iOS 8 et les versions ultérieures.

J’ai écrit les deux méthodes d’extension C # suivantes pour définir la largeur totale du séparateur UITableView au niveau UITableView ou UITableViewCell. Vous pouvez utiliser l’une de ces méthodes ou les deux en fonction de l’effet souhaité (voir les explications ci-dessous).

UITableView

Définissez les propriétés UITableView pour modifier les séparateurs qui apparaissent après les cellules vides. Cette méthode SetLayoutMarginsZero peut être appelée à partir de la méthode ViewDidLoad de ViewController associée.

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

UITableViewCell

Définissez les propriétés UITableViewCell pour modifier les séparateurs qui apparaissent après les cellules remplies. Cette méthode SetLayoutMarginsZero peut être appelée à partir de la méthode TableViewSource GetCell.

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