673 votes

iOS 8 UITableView separator insert 0 ne fonctionne pas

J'ai une application où l'incrustation Separator de tableview est définie sur custom - Right 0, left 0. Cela fonctionne parfaitement dans iOS 7.x, mais dans iOS 8.0, je vois que l'insert de séparateur est réglé sur la valeur par défaut de 15 sur la droite. Même si dans les fichiers xib il a la valeur 0, il apparaît toujours incorrectement.

1074voto

cdstamper Points 196

iOS introduit le layoutMargins de propriété sur les cellules ET les vues de table. Vous aurez besoin de mettre les deux d'entre eux.

Cette propriété n'est pas disponible dans iOS 7.0 vous devez donc vous assurez-vous de vérifier avant de l'affecter!

L'utilisation de Ricky solution pour définir layoutMargin sur la cellule:

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

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

Vous devez également définir la même propriété sur la vue de la table. J'ai découvert, grâce à beaucoup de twitter et d'erreurs, que vous devez définir ce en viewDidLayoutSubviews.

Configurer l'affichage de la table de la même façon:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

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

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

...et là vous allez! Cela devrait fonctionner dans iOS 8 ainsi que iOS 7.

Edit: Selon @bffmike sur Twitter, vous pouvez également le configurer preservesSuperviewLayoutMargins=PAS sur les cellules. Encore une fois, YMMV.

259voto

user3570727 Points 1347

Arg !!! Après avoir joué autour de faire cela dans votre sous-classe Cell :

 - (UIEdgeInsets)layoutMargins
{
    return UIEdgeInsetsZero;
}
 

ou en définissant le cell.layoutMargins = UIEdgeInsetsZero; fixe pour moi.

179voto

Mike Abdullah Points 9464

Prenons un moment pour comprendre le problème avant de aveuglément à la charge pour tenter de le résoudre.

Un rapide fouiner dans le débogueur, vous diront que le séparateur de lignes sont des sous-vues d' UITableViewCell. Il semble que la cellule elle-même prend une bonne quantité de la responsabilité de la mise en page de ces lignes.

iOS 8 introduit le concept de mise en page marges. Par défaut, un point de vue de la mise en page marges 8pt sur tous les côtés, et ils sont héritées des ancêtres points de vue.

Du mieux que nous pouvons dire, lors de la présentation de sa ligne de séparation, UITableViewCell choisit à l'égard de la gauche mise en page de la marge, de l'utiliser pour contraindre la gauche en médaillon.

Mettre tout ça ensemble, à atteindre l'encart de vraiment de zéro, nous avons besoin de:

  • Définir la mise en page à gauche de la marge d' 0
  • Arrêter tout hérité des marges primordial que

Mettre comme ça, c'est une tâche assez simple à réaliser:

cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = NO;

Choses à noter:

  • Ce code seulement besoin d'être exécuté une fois par cellule (vous êtes tout simplement la configuration de la cellule propriétés, après tout), et il n'y a rien de spécial lorsque vous choisissez exécuter. Faire ce qui semble le plus propre à vous.
  • Malheureusement, ni la propriété est disponible pour la configuration de l'Interface Builder, mais vous pouvez spécifier un utilisateur défini par l'exécution de l'attribut pour l' preservesSuperviewLayoutMargins si vous le souhaitez.
  • Clairement, si votre application cibles précédentes OS communiqués de trop, vous aurez besoin pour éviter l'exécution du code ci-dessus jusqu'à ce qu'en cours d'exécution sur iOS 8 et ci-dessus.
  • Plutôt que de fixer preservesSuperviewLayoutMargins, vous pouvez configurer ancêtre points de vue (comme le tableau) ont 0 de la marge de gauche, mais cela semble intrinsèquement plus sujettes à l'erreur que vous n'avez pas de contrôle que l'ensemble de la hiérarchie.
  • Il serait probablement légèrement nettoyeur de définir la marge de gauche pour 0 et de laisser les autres être.
  • Si vous voulez avoir un 0 en médaillon sur le "plus" des séparateurs UITableView tirages au bas de la plaine de tables de style, je suppose que nécessitera précisant les mêmes paramètres au niveau de la table trop (n'ai pas essayé celui-là!)

59voto

Ricky Points 3887

Je crois que c'est la même question que j'ai posée ici: Supprimer SeparatorInset sur iOS 8 UITableView pour XCode 6 Simulateur d'iPhone

Dans iOS 8, il y a une nouvelle propriété pour tous les objets héritent d' UIView. Donc, la solution pour régler le SeparatorInset dans iOS 7.x ne sera pas en mesure de supprimer l'espace blanc que vous voyez sur la UITableView dans iOS 8.

La nouvelle propriété est appelée "layoutMargins".

@property(nonatomic) UIEdgeInsets layoutMargins
Description   The default spacing to use when laying out content in the view.
Availability  iOS (8.0 and later)
Declared In   UIView.h
Reference UIView Class Reference

iOS 8 UITableView setSeparatorInset:UIEdgeInsetsZero setLayoutMargins:UIEdgeInsetsZero

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

Si vous définissez cell.layoutMargins = UIEdgeInsetsZero; sans vérifier si l' layoutMargins existe, l'application crash sur iOS 7.x. Donc, la meilleure façon serait de vérifier si l' layoutMargins existe tout d'abord avant d' setLayoutMargins:UIEdgeInsetsZero.

38voto

swilliams Points 19415

SWIFT, c’est un peu plus ennuyeux parce que `` est une propriété, il faut substituer l’accesseur get et Set.

Cela rendra effectivement `` readonly, qui, dans mon cas, est très bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X