web-dev-qa-db-fra.com

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

J'ai donc un UITableView où les séparateurs n'ont pas toute la 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 possèdent pas de sélecteurs de largeur complète, mais les cellules vides ont une largeur totale.

Comment puis-je résoudre ce problème?

Merci pour votre aide

134
Timo Cengiz

Ok j'ai trouvé la réponse. Je ne sais pas pourquoi je ne suis pas tombé sur ce message avant, mais bien sûr, une fois que vous avez posé une question, le bon message apparaît tout à coup devant vous. J'ai eu la réponse de ce post: iOS 8 UITableView séparateur encart 0 ne fonctionne pas

Ajoutez simplement ce code sur votre TableViewController

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

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
}

Swift 3. Mise à jour

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

Dans votre UITableViewCell

Accédez à l'inspecteur d'attributs dans votre Interface Builder et remplacez simplement "15" par 0. Faites-le pour toutes les cellules que vous souhaitez modifier.

instets

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

91
Hannah Louisa Carney

pour Swift 3:

override func viewDidLoad() {
  super.viewDidLoad()

  tableView.separatorInset = .zero
  tableView.layoutMargins = .zero
}
21
Wilson

J’ai hérité de UITableViewController et j’ai eu besoin de compléter les paramètres insérés dans willDisplayCell et de définir également preservesSuperviewLayoutMargins sur 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
        }
}
19
H6.
  1. Sélectionnez vous UITableViewCell
  2. Aller à Inspecteur d'attributs
  3. Allez à séparateur et remplacez-le par "Inserts personnalisés"
  4. Définissez les champs left et/ou right. (Par défaut left: 15, right: 0)

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

enter image description here

Résultat:

enter image description here

17
Sebastián Lara

Le séparateur Inset est par défaut 15 de gauche. Modifiez l'option Separator Inset de auto en custom et définissez l'encart sur 0.

enter image description here

9
Ramin

Pour les personnes ayant des problèmes avec l'iPad, vous serez dans un état identique à celui de l'iPhone. Vous pouvez ensuite ajuster le separatorInset selon vos besoins.

tableView.cellLayoutMarginsFollowReadableWidth = false
9
Michael Rose

pour Swift dans iOS 9+

si vous utilisez un personnalisé UITableViewCell:

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

alors pour votre tableView dans viewDidLoad:

    self.tableView?.separatorInset = UIEdgeInsetsZero;
    self.tableView?.layoutMargins = UIEdgeInsetsZero;
8
Christopher Larsen

Testé pour iOS 9.3 & Swift 2.2. Assurez-vous de mettre le code dans willDisplayCell qui est appelée juste avant d'afficher la cellule et non dans cellForRowAtIndexPath où vous créez uniquement la cellule.

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

Ajoutez override à la fonction de UITableViewController, comme suit: override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {

8
oyalhi

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

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

Aucune de ces solutions ne fonctionnait pour moi dans Swift 2.2 et Xcode 7.3.1

S'est avéré être la solution la plus simple de tous. Aucun code requis. Il suffit de changer les valeurs TableViewCell Layout Margins dans votre inspecteur UITableView:

5
aurawindsurfing

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
        }
    }
4
Giulio Colleluori

Aucune de ces solutions ne fonctionne sur l'iPad, mais j'ai mis au point une solution couvrant 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 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 de UITableView & UITableViewCell.

0
Charles Robertson

Dans viewDidLoad (testé iOS11 - Swift 4.1)

essayer

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

0
Giang