web-dev-qa-db-fra.com

Existe-t-il un moyen de faire en sorte que les cellules UITableView dans iOS 7 n'aient pas de saut de ligne dans le séparateur?

J'ai remarqué que dans iOS 7, UITableViewCells a un saut de ligne dans le séparateur de la cellule que iOS 6 n'a pas. Existe-t-il un moyen de se débarrasser de cette rupture de ligne? La modification du séparateur sur aucun, puis la création d'UIViews avec la couleur du séparateur entraîne toujours le séparateur blanc.

68
Anthony Glyadchenko

Pour iOS7:

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

Pour iOS8:

Configurez d'abord votre vue de table 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 les deux layoutMargins et separatorInset , pour prendre en charge les deux versions d'iOS

116
Luis E. Prado

Vous pouvez également définir le 'Séparateur Encart' dans le storyboard:

enter image description here

enter image description here

44
null

Si vous souhaitez prendre en charge les 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];
}
37
boro

Deviner.

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

Version Swift

iOS présente 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 la vérifier avant de l'attribuer!

Cependant, Apple a ajouté une propriété ** à votre cellule qui l'empêchera d'hériter des paramètres de marge de votre vue tableau. De cette façon, vos cellules peuvent configurer leurs propres marges indépendamment de la vue tableau. de celui-ci comme un remplacement.

Cette propriété est appelée préserveSuperviewLayoutMargins , et la définir sur NO peut vous permettre de remplacer les paramètres layoutMargin de votre vue tableau par le paramètre layoutMargin de votre propre cellule. Il permet à la fois de gagner du temps ( vous n'avez pas à modifier les paramètres de la vue Table), et est plus concis. Veuillez vous référer à la réponse de Mike Abdullah pour une explication détaillée.

REMARQUE: il s'agit de l'implémentation appropriée et moins compliquée, comme exprimé dans la réponse de Mike Abdullah; définir la conservation de votre celluleSuperviewLayoutMargins = NO garantira que votre vue Tableau ne remplace pas les paramètres de la cellule.

Première étape - Configurez vos marges de 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
    }
}

Si vous définissez la propriété NO devrait, la propriété conserveSuperviewLayoutMargins sur votre cellule empêche la vue de votre table de remplacer les marges de votre cellule. Dans certains cas, il semble ne pas fonctionner correctement.

Deuxième étape - Seulement si tout échoue, vous pouvez forcer brutalement vos marges d'affichage de 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 c'est parti! Cela devrait fonctionner sur iOS 8 ainsi que sur iOS 7.

Remarque: 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 n'est requise que si vous avez des cellules non peuplées sous les cellules rendues, c'est-à-dire. si le tableau est plus grand que le nombre de lignes dans le modèle de tableau. Ne pas effectuer la deuxième étape entraînerait des décalages de séparateur différents.

9
King-Wizard

La réponse sélectionnée n'a pas fonctionné pour moi. Mais cela oui et cela fonctionne à partir d'ios 2.0:

   [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
9
anasaitali

Pour une solution permanente à l'échelle de l'application, appelez ceci dans l'application: didFinishLaunching .. n'importe quelle table sera "corrigée"

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

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

  1. Dans ApplicationDidFinishLaunching, exécutez ce qui suit:

    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];
      }
    }
    
7
William Jockusch

Dans iOS 8, il semble y avoir un petit bug. La valeur personnalisée pour l'encart de 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 du code, mais aucun n'a fonctionné. J'ai également déposé un rapport de bogue.

enter image description here

En attendant, j'ai une petite solution pour y parvenir. Je trace 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 comme c'est fondamentalement C, vous pouvez également 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)
}
6
Isuru

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

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

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];
   }
}
3
Tea

Attention, la définition de separatorInset of tableView sur UIEdgeInsetsZero semble casser la marge gauche des titres de section en même temps! (au moins, c'est le cas sur iOS 7.1)

Si vous souhaitez afficher les titres de section avec tableView: titleForHeaderInSection: et obtenir toujours l'effet souhaité de ne pas couper 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];
2
Bluezen

Pour iOS8 + cela a fonctionné pour moi,

tableView.layoutMargins = UIEdgeInsetsZero

et dans la méthode cellForRowAtIndexPath:

cell.layoutMargins = UIEdgeInsetsZero;
1
Zaid Pathan
@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 UITableviewCell, la réponse de Willam fonctionne parfaitement.

0
HamGuy

Vers 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 ignoré la méthode layoutSubviews, si vous remplissez deux conditions, continuez à lire .

Faites-le ou vérifiez-le étape par étape.

1 、 Après avoir alloué et initialisé le 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 avoir alloué et initialisé votre UITableViewCell personnalisé, définissez sa propriété layoutMargins.

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

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

- (void)layoutSubviews
{
    [super layoutSubviews] ;

    // layout the subviews
}
0
KudoCC
- (void)viewDidLoad
{
    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];

    [super viewDidLoad];

    // Additional setup
}

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

0
Matt Rundle

Version Xamarin.iOS

J'ai étendu le séparateur UITableView sur toute la largeur dans Xamarin.iOS sur iOS 8.4 avec l'aide de publications de Luis E. Prado et Roi-sorcier . J'ai dû définir à la fois SeparatorInset et LayoutMargins pour le faire fonctionner. Je n'ai pas rédigé de chèques pour les versions iOS inférieures depuis que je cible iOS 8 et supérieur.

J'ai écrit les deux méthodes d'extension C # suivantes pour définir la pleine largeur 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).

ITableView

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

ITableViewCell

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;
}
0
Mobile Dan