Comment définir la largeur totale du séparateur dans UITableView


149

J'ai un UITableViewoù les séparateurs n'ont pas la pleine largeur. Il se termine comme 10 pixels avant le côté gauche. Je jouais avec ce code dans le viewDidLoad().

self.tableView.layoutMargins = UIEdgeInsetsZero;

Également dans le storyboard lorsque vous pouvez sélectionner des sélecteurs personnalisés ou par défaut. Désormais, toutes les cellules remplies ne disposent pas des sélecteurs pleine largeur, mais les cellules vides ont la pleine largeur.

Comment puis-je réparer cela?


9
UITableViewa une propriété separatorInset. Réglez l'encart du UITableViewséparateur de ligne sur zéro. Vous pouvez également changer le à separatorInsetpartir du storyboard
KRUKUSA

Réponses:


220

Cela a fonctionné pour moi sur les appareils iOS 8.4 - 9.0 utilisant Xcode 6.4 et Swift 1.2:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = UITableViewCell()


    cell.preservesSuperviewLayoutMargins = false
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero

    return cell
}

Mise à jour de Swift 5:

cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero

Pourquoi cela supprime-t-il ma table avec une table vide? Les séparateurs sont déplacés mais je ne vois aucun de mes boutons
Oscar

1
@James pourriez-vous s'il vous plaît expliquer "supprimer ma table avec une table vide?". Comment avez-vous ajouté vos boutons (via IB, code)?
MB_iOSDeveloper

1
Très belle solution. Mais dans mon cas, j'ai mis le code directement à l'initialisation de la cellule, car je voulais avoir une largeur totale de séparateur dans tous les contrôleurs.
Vojta

Au cas où cela ne serait pas évident, cela fonctionne également pour Objective-C avec les changements de syntaxe appropriés bien sûr.
cohenadair

1
Aucune de ces solutions ne fonctionne sur un iPad. Cela ne fonctionne que sur un iPhone ...
Charles Robertson

103

J'ai eu la réponse de ce post: le séparateur UITableView d'iOS 8 0 ne fonctionne pas

Ajoutez simplement ce code sur votre UITableViewController

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

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

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

2
cela fonctionne pour moi pour ajouter uniquement la méthode déléguée tableView
TonyTony

Je suis désolé de ne pas avoir compris. Vous voulez dire qu'il vous suffisait d'ajouter le TableViewDeleagte ?. J'ai juste essayé d'ajouter que cela ne fonctionnait pas pour moi @TonyTony
Timo Cengiz

3
pour moi, la méthode viewDidLayoutSubviewsn'est pas nécessaire
TonyTony

Avez-vous essayé d'exécuter votre code avec d'autres versions d'IOS que 8? Peut-être que cela fonctionne pour les plus récents. Sinon bon pour vous que ça marche. J'ai simplement essayé d'ajouter la méthode de délégué tableview et cela n'a pas aidé. @TonyTony
Timo Cengiz

J'ai dû utiliser les deux. J'ai essayé d'utiliser chacun individuellement sans succès. Cela ne fonctionnait que lorsque j'utilisais les deux. De plus, je l'ai essayé lorsque mon contrôleur de vue était une sous-classe de UITableViewController, et quand c'était une sous-classe de UIViewController. Aucune différence. Notez que je cours dans le simulateur 8.1.
Ron

100

Dans votre UITableViewCell

Accédez à l'inspecteur d'attributs dans votre générateur d'interface et remplacez simplement "15" par 0. Faites cela pour toutes les cellules que vous souhaitez modifier.

instets

Vous devrez peut-être ajouter [cell setLayoutMargins:UIEdgeInsetsZero];à votretableViewCell


1
Ou c'est bizarre. Cela a fonctionné pour moi (merci!) Sur les lignes où j'avais UITableViewCells à afficher, mais sur toutes les lignes vides en dessous, le séparateur était toujours en retrait de 15 pixels.
Mike Gledhill

Si vous utilisez des cellules statiques, tout ce dont vous avez besoin est de changer l'encart de gauche en 0 comme décrit dans l'image (Travailler sous iOS 10, Xcode 8.3.1)
Ignacio Valdivieso

29

pour Swift 3:

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.separatorInset = .zero
  tableView.layoutMargins = .zero
}

21
  1. Sélectionnez votre UITableViewCell
  2. Accédez à l' inspecteur des attributs
  3. Allez dans Séparateur et changez-le en "Insets personnalisés"
  4. Ensemble leftet / ou rightchamps. (Par défaut left: 15,right: 0 )

Regardez comment cela fonctionne (en utilisant left: 100):

entrez la description de l'image ici

Résultat:

entrez la description de l'image ici


1
duplicata de la réponse précédente de @Hannah Louisa Carney
Konstantin Salavatov

19

UITableViewControllerJ'hérite et j'avais besoin de plus des paramètres des deux inserts pour définir willDisplayCellégalement preservesSuperviewLayoutMarginssur false. Dans Swift, cela ressemble à ceci:

override func tableView(_tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

    if cell.respondsToSelector("setSeparatorInset:") {
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setLayoutMargins:") {
        cell.layoutMargins = UIEdgeInsetsZero
    }
    if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
        cell.preservesSuperviewLayoutMargins = false
    }
}

Vous n'avez pas besoin de définir preservesSuperviewLayoutMargins = falsecar la valeur par défaut est déjà fausse
crubio

2
Notez que cela n'ajustera pas les séparateurs sur les cellules «fictives» affichées par le contrôleur pour remplir la vue sous vos cellules si vos cellules ne font pas toute la hauteur.
Tieme

11

Le séparateur Insetest par défaut 15 à gauche. Modifiez l' Insetoption Séparateur de autoà customet définissez l'encart sur 0.

entrez la description de l'image ici


9

Pour Swift dans iOS 9+

Si vous utilisez un personnalisé UITableViewCell:

override var layoutMargins: UIEdgeInsets {
    get { return UIEdgeInsetsZero }
    set(newVal) {}
}

alors pour votre UITableViewen viewDidLoad:

self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;

C'est la seule réponse qui a résolu le problème pour moi (mise à jour vers swift 3). Cependant ... cela fonctionne quand il y a des données dans la cellule. Pour les cellules vides qui n'ont pas encore été remplies (et je suppose que je n'ai pas appelé cette variable layoutMargins remplacée), le séparateur ne remplit toujours pas toute la largeur de ma cellule personnalisée dans le tableau. Des idées là-dessus?
RanLearns

Sur l'iPhone, le séparateur se termine à quelques pixels de la gauche et à quelques pixels de la droite sur les cellules vides. Cela semble correct sans utiliser cette astuce pour mettre à zéro les marges. Sur l'iPad, c'est le vrai problème - les séparateurs sur une cellule vide partent du bord gauche de la vue du tableau, seulement environ 80% de la largeur de la cellule. Lorsqu'il y a des données dans la cellule, le séparateur fait toujours 80% de la largeur de la cellule, mais il commence à 20% de l'entrée et va jusqu'au bord droit de la vue du tableau
RanLearns

1
J'ai trouvé une solution ... en utilisant if #available (iOS 9, *) {self.tableView.cellLayoutMarginsFollowReadableWidth = false} a fait en sorte que je n'ai pas du tout besoin de votre code sur iPhone. Le séparateur va juste sur toute la largeur. Sur iPad, les cellules vides ont un séparateur pleine largeur, mais j'ai besoin de votre code pour conserver toute la largeur lorsque des données sont ajoutées. Sinon, il y a quelques pixels à gauche ajoutés là où il n'y a pas de séparateur une fois que les données remplissent la cellule.
RanLearns

1
Répondez où j'ai obtenu le code dans le commentaire ci-dessus à partir de: stackoverflow.com/a/31538250/428981
RanLearns

9

Pour les personnes ayant des problèmes avec l'iPad, cela vous mettra dans un état identique à celui de l'iPhone. Vous pouvez ensuite ajuster le separatorInsetau besoin.

tableView.cellLayoutMarginsFollowReadableWidth = false

C'était mon problème sur iOS 10 contre iOS 11. iOS 11 était bien, mais 10 avait des marges différentes. Merci!!!
migs647

9

Utilisez-le dans la cellForRowAtIndexPathméthode, pour configurer les spécifications du séparateur de cellule,
cela fonctionne parfaitement pour iOS9.0 +

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

8

Testé pour iOS 9.3 et Swift 2.2. Assurez-vous de mettre le code dans willDisplayCelllequel est appelé juste avant d'afficher la cellule et non à l' cellForRowAtIndexPathendroit où vous créez la cellule uniquement.

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.separatorInset = UIEdgeInsetsZero
    cell.layoutMargins = UIEdgeInsetsZero
}

Ajouter override à la fonction pour UITableViewController, comme ceci:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

5

Rien de ce qui précède n'a fonctionné pour moi dans Swift 2.2 et Xcode 7.3.1

S'est avéré être la solution la plus simple de toutes. Aucun code nécessaire. Modifiez simplement les TableViewCellvaleurs des marges de mise en page dans votre UITableViewinspecteur:


4

Pour Swift 3:

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
        cell.separatorInset = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
        cell.layoutMargins = UIEdgeInsets.zero
    }
    if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
}

1

Dans viewDidLoad(testé iOS11 - swift 4.1)

essayer

tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)


0

Aucune de ces solutions ne fonctionne sur l'iPad, mais j'ai trouvé une solution qui couvre les deux appareils:

Avec cellules réutilisables:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    ...[other code]...
    [cell setLayoutMargins:UIEdgeInsetsZero];
    [cell setSeparatorInset:UIEdgeInsetsZero];
    return cell;
}

Avec des cellules non réutilisables:

- (void)removeSeparatorInset:(UITableView*)tableView{
    NSArray *cells = [tableView visibleCells];
    for (UITableViewCell *cell in cells){
        [cell setLayoutMargins:UIEdgeInsetsZero];
        [cell setSeparatorInset:UIEdgeInsetsZero];
    }
}

-(void) viewDidLayoutSubviews{
   [super viewDidLayoutSubviews];
   [self removeSeparatorInset:self.tableView];
}

Juste pour développer cette approche:

@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;

Les deux propriétés peuvent être utilisées par UITableView& UITableViewCell. Ce dernier est, en fait, une propriété de UIView, qui est une classe parente des deux UITableView& UITableViewCell.


1
La seule solution viable que j'ai trouvée pour les cellules non réutilisables
Mickey

0

swift 5, mise à jour Xcode 11

placez cette vue à l'intérieur de viewDidLoad ()

yourTableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

pour le séparateur bord à bord, définissez simplement la valeur de gauche et de droite sur 0.

en passant, changez le "yourTableView" en votre nom de sortie tableView.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.