web-dev-qa-db-fra.com

Masquer la ligne de séparation sur un UITableViewCell

Je personnalise une UITableView. Je veux masquer la ligne séparant le dernier cellule ... puis-je le faire?

Je sais que je peux faire tableView.separatorStyle = UITableViewCellStyle.None mais cela affecterait tout les cellules de la table. Je veux que cela n'affecte que ma dernière cellule.

204
Safari

dans viewDidLoad, ajoutez cette ligne:

self.tableView.separatorColor = [UIColor clearColor];

et dans cellForRowAtIndexPath

pour les versions inférieures iOS 

if(indexPath.row != self.newCarArray.count-1){
    UIImageView *line = [[UIImageView alloc] initWithFrame:CGRectMake(0, 44, 320, 2)];
    line.backgroundColor = [UIColor redColor];
    [cell addSubview:line];
}

pour iOS 7 versions supérieures (y compris iOS 8)

if (indexPath.row == self.newCarArray.count-1) {
    cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}
326
Hiren

Vous pouvez utiliser le code suivant:

Rapide :

if indexPath.row == {your row number} {
    cell.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: .greatestFiniteMagnitude)
}

ou : 

cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, UIScreen.main.bounds.width)

pour la marge par défaut: 

cell.separatorInset = UIEdgeInsetsMake(0, tCell.layoutMargins.left, 0, 0)

afficher le séparateur de bout en bout 

cell.separatorInset = .zero

Objectif c:

if (indexPath.row == {your row number}) {
    cell.separatorInset = UIEdgeInsetsMake(0.0f, 0.0f, 0.0f, CGFLOAT_MAX);
}
209
Avinash

Pour donner suite à la réponse de Hiren.

dans ViewDidLoad et la ligne suivante:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

Ou, si vous utilisez XIB ou que Storyboards change " separator " en " none ":

Interface builder

Et dans CellForRowAtIndexPath ajoutez ceci:

CGFloat separatorInset; // Separator x position 
CGFloat separatorHeight; 
CGFloat separatorWidth; 
CGFloat separatorY; 
UIImageView *separator;
UIColor *separatorBGColor;

separatorY      = cell.frame.size.height;
separatorHeight = (1.0 / [UIScreen mainScreen].scale);  // This assures you to have a 1px line height whatever the screen resolution
separatorWidth  = cell.frame.size.width;
separatorInset  = 15.0f;
separatorBGColor  = [UIColor colorWithRed: 204.0/255.0 green: 204.0/255.0 blue: 204.0/255.0 alpha:1.0];

separator = [[UIImageView alloc] initWithFrame:CGRectMake(separatorInset, separatorY, separatorWidth,separatorHeight)];
separator.backgroundColor = separatorBGColor;
[cell addSubView: separator];

Voici un exemple de résultat dans lequel j'affiche une vue de table avec des cellules dynamiques (une seule contenant le contenu). Le résultat étant que seul celui-ci a un séparateur et que toutes les vues factices "factices" ne sont pas ajoutées automatiquement pour remplir l'écran.

enter image description here

J'espère que cela t'aides.

EDIT: Pour ceux qui ne lisent pas toujours les commentaires, il existe un meilleur moyen de le faire avec quelques lignes de code: 

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.tableFooterView = UIView()
}
84
Benjamin

Si vous ne voulez pas dessiner le séparateur vous-même, utilisez ceci:

  // Hide the cell separator by moving it to the far right
  cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

Cette API est uniquement disponible à partir d’iOS 7.

50
Kemenaran

mon environnement de développement est

  • Xcode 7.0
  • 7A220 Swift 2.0
  • iOS 9.0

les réponses ci-dessus ne fonctionnent pas complètement pour moi

après avoir essayé, ma solution finalement efficace est la suivante:

let indent_large_enought_to_hidden:CGFloat = 10000
cell.separatorInset = UIEdgeInsetsMake(0, indent_large_enought_to_hidden, 0, 0) // indent large engough for separator(including cell' content) to hidden separator
cell.indentationWidth = indent_large_enought_to_hidden * -1 // adjust the cell's content to show normally
cell.indentationLevel = 1 // must add this, otherwise default is 0, now actual indentation = indentationWidth * indentationLevel = 10000 * 1 = -10000

et l'effet est:  enter image description here

29
crifan

Meilleure solution pour iOS 7 et 8

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    DLog(@"");
    if (cell && indexPath.row == 0 && indexPath.section == 0) {

        DLog(@"cell.bounds.size.width %f", cell.bounds.size.width);
        cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.0f);
    }
}

Si votre application est rotative, utilisez 3000.0f comme constante d’encart à gauche ou calculez-la à la volée . Si vous essayez de définir l’encart à droite, vous avez une partie visible du séparateur à gauche de la cellule sur iOS 8.

8
Sound Blaster

Dans Swift 3 et Swift 4 , vous pouvez écrire une extension dans UITableViewCell comme ceci:

extension UITableViewCell {

  func hideSeparator() {
    self.separatorInset = UIEdgeInsets(top: 0, left: self.bounds.size.width, bottom: 0, right: 0)
  }

  func showSeparator() {
    self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
  }
}

Ensuite, vous pouvez utiliser ceci comme ci-dessous (lorsque cellule est votre instance de cellule):

cell.hideSeparator()
cell.showSeparator()

Il est vraiment préférable d’affecter la largeur de la cellule de la vue de tableau en tant qu’incrustation gauche au lieu de lui attribuer un nombre aléatoire. Parce que dans certaines dimensions d'écran, peut-être pas maintenant mais dans le futur, vos séparateurs peuvent toujours être visibles car ce nombre aléatoire peut ne pas être suffisant. De plus, sur iPad en mode paysage, vous ne pouvez pas garantir que vos séparateurs seront toujours invisibles.

8

Dans iOS 7, le séparateur de cellules de style groupé UITableView a un aspect légèrement différent. Cela ressemble un peu à ceci:

enter image description here

J'ai essayé la réponse de Kemenaran:

cell.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);

Cependant, cela ne semble pas fonctionner pour moi. Je ne sais pas pourquoi. J'ai donc décidé d'utiliser réponse de Hiren, mais en utilisant UIView au lieu de UIImageView, et trace la ligne dans le style iOS 7:

UIColor iOS7LineColor = [UIColor colorWithRed:0.82f green:0.82f blue:0.82f alpha:1.0f];

//First cell in a section
if (indexPath.row == 0) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

} else if (indexPath.row == [self.tableViewCellSubtitles count] - 1) {

    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];

    UIView *lineBottom = [[UIView alloc] initWithFrame:CGRectMake(0, 43, self.view.frame.size.width, 1)];
    lineBottom.backgroundColor = iOS7LineColor;
    [cell addSubview:lineBottom];
    [cell bringSubviewToFront:lineBottom];

} else {

    //Last cell in the table view
    UIView *line = [[UIView alloc] initWithFrame:CGRectMake(21, 0, self.view.frame.size.width, 1)];
    line.backgroundColor = iOS7LineColor;
    [cell addSubview:line];
    [cell bringSubviewToFront:line];
}

Si vous utilisez cela, assurez-vous de bien indiquer la hauteur de vue de table correcte dans la deuxième instruction if. J'espère que cela est utile pour quelqu'un.

7
Enrico Susatyo

Dans votre sous-classe UITableViewCell, remplacez layoutSubviews et masquez _UITableViewCellSeparatorView. Fonctionne sous iOS 10.

override func layoutSubviews() {
    super.layoutSubviews()

    subviews.forEach { (view) in
        if view.dynamicType.description() == "_UITableViewCellSeparatorView" {
            view.hidden = true
        }
    }
}
6
Tualatrix Chou

Utilisez cette sous-classe, l'ensemble separatorInset ne fonctionnant pas pour iOS 9.2.1, le contenu serait compressé. 

@interface NSPZeroMarginCell : UITableViewCell

@property (nonatomic, assign) BOOL separatorHidden;

@end

@implementation NSPZeroMarginCell

- (void) layoutSubviews {
    [super layoutSubviews];

    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            if (CGRectGetHeight(view.frame) < 3) {
                view.hidden = self.separatorHidden;
            }
        }
    }
}

@end

https://Gist.github.com/liruqi/9a5add4669e8d9cd3ee9

4
liruqi

Je ne crois pas que cette approche fonctionnera en toutes circonstances avec des cellules dynamiques ...

if (indexPath.row == self.newCarArray.count-1) {
  cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}

Quelle que soit la méthode tableview utilisée pour les cellules dynamiques, la cellule sur laquelle vous avez modifié la propriété inset aura toujours la propriété inset définie à chaque fois qu'elle est retirée de la file d'attente, ce qui provoque une série de séparateurs de ligne manquants ... change toi-même.

Quelque chose comme ça a fonctionné pour moi:

if indexPath.row == franchises.count - 1 {
  cell.separatorInset = UIEdgeInsetsMake(0, cell.contentView.bounds.width, 0, 0)
} else {
  cell.separatorInset = UIEdgeInsetsMake(0, 0, cell.contentView.bounds.width, 0)
}

De cette façon, vous mettez à jour l'état de votre structure de données à chaque chargement

4
Greg Price

Le plus simple et logique est de faire ceci:

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { return [[UIView alloc] initWithFrame:CGRectZero]; }

Dans la plupart des cas, vous ne voulez pas voir uniquement le dernier séparateur de tableCiewCell. Et cette approche ne supprime que le dernier séparateur tableViewCell, et vous n’avez pas besoin de penser aux problèmes d’auto-dépose (c’est-à-dire de rotation d’un périphérique) ou de valeurs codées en dur pour configurer des inserts de séparateur.

4
rostislawk

Dans Swift using iOS 8.4 :

/*
    Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
                        willDisplayCell cell: UITableViewCell,
                        forRowAtIndexPath indexPath: NSIndexPath)
{
    if indexPath.row == 3 {
        // Hiding separator line for only one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
    }
}

Remarque: cet extrait de code ci-dessus fonctionnera sur UITableView à l'aide de cellules dynamiques. Le seul problème que vous pouvez rencontrer concerne l'utilisation de cellules statiques avec des catégories, un type de séparateur différent de zéro et un style groupé pour la vue tabulaire. En fait, dans ce cas particulier, la dernière cellule de chaque catégorie ne sera pas masquée. Pour résoudre ce problème, la solution que j'ai trouvée consistait à définir le séparateur de cellules (via IB) sur none, puis de créer et d'ajouter manuellement (via du code) votre vue linéaire à chaque cellule. Pour un exemple, s'il vous plaît vérifier l'extrait ci-dessous:

/*
Tells the delegate that the table view is about to draw a cell for a particular row. (optional)
*/
override func tableView(tableView: UITableView,
    willDisplayCell cell: UITableViewCell,
    forRowAtIndexPath indexPath: NSIndexPath)
{
    // Row 2 at Section 2
    if indexPath.row == 1 && indexPath.section == 1 {
        // Hiding separator line for one specific UITableViewCell
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)

        // Here we add a line at the bottom of the cell (e.g. here at the second row of the second section).
        let additionalSeparatorThickness = CGFloat(1)
        let additionalSeparator = UIView(frame: CGRectMake(0,
            cell.frame.size.height - additionalSeparatorThickness,
            cell.frame.size.width,
            additionalSeparatorThickness))
        additionalSeparator.backgroundColor = UIColor.redColor()
        cell.addSubview(additionalSeparator)
    }
}
4
King-Wizard

En utilisant Swift 3 et en adoptant la méthode de piratage la plus rapide, vous pouvez améliorer le code en utilisant extensions:

extension UITableViewCell {

    var isSeparatorHidden: Bool {
        get {
            return self.separatorInset.right != 0
        }
        set {
            if newValue {
                self.separatorInset = UIEdgeInsetsMake(0, self.bounds.size.width, 0, 0)
            } else {
                self.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)
            }
        }
    }

}

Ensuite, lorsque vous configurez la cellule:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "identifier", for: indexPath)
    switch indexPath.row {
       case 3:
          cell.isSeparatorHidden = true
       default:
          cell.isSeparatorHidden = false
    }
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let cell = tableView.cellForRow(at: indexPath)
    if cell.isSeparatorHidden { 
       // do stuff
    }
}
3
Luca Davanzo

si la réponse acceptée ne fonctionne pas, vous pouvez essayer ceci:

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return 0.01f; }

C'est bien ;)

2
debiasej

Rapide:

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    ...

    // remove separator for last cell
    cell.separatorInset = indexPath.row < numberOfRowsInSection-1
        ? tableView.separatorInset
        : UIEdgeInsets(top: 0, left: tableView.bounds.size.width, bottom: 0, right: 0)

    return cell
}

Objectif c:

- (UITableViewCell *)tableView:(UITableView *)tableView
     cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    ...

    // remove separator for last cell
    cell.separatorInset = (indexPath.row < numberOfRowsInSection-1)
        ? tableView.separatorInset
        : UIEdgeInsetsMake(0.f, tableView.bounds.size.width, 0.f, 0.f);

    return cell;
}
2
RyuX51

Dans willdisplaycell:

cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
2
Kimate Richards
  if([_data count] == 0 ){
       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];//  [self tableView].=YES;
    } else {
      [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];////    [self tableView].hidden=NO;
    }
2
Gank

Pour Swift 2:

ajoutez la ligne suivante à viewDidLoad():

tableView.separatorColor = UIColor.clearColor()
1
Sebastian
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

       NSString *cellId = @"cell";
       UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
       NSInteger lastRowIndexInSection = [tableView numberOfRowsInSection:indexPath.section] - 1;

       if (row == lastRowIndexInSection) {
              CGFloat halfWidthOfCell = cell.frame.size.width / 2;
              cell.separatorInset = UIEdgeInsetsMake(0, halfWidthOfCell, 0, halfWidthOfCell);
       }
}
1
Adobels

Je ne pouvais pas cacher le séparateur sur une cellule spécifique, à l'exception de la solution de contournement suivante

- (void)layoutSubviews {
    [super layoutSubviews];
    [self hideCellSeparator];
}
// workaround
- (void)hideCellSeparator {
    for (UIView *view in  self.subviews) {
        if (![view isKindOfClass:[UIControl class]]) {
            [view removeFromSuperview];
        }
    }
}
1
Mahmoud Adam
cell.separatorInset = UIEdgeInsetsMake(0.0, cell.bounds.size.width, 0.0, -cell.bounds.size.width)

fonctionne bien dans iOS 10.2

 enter image description here

1
katwal-Dipak

Vous devez prendre une cellule personnalisée, ajouter une étiquette et définir une contrainte telle qu'une étiquette doit couvrir la totalité de la zone de cellule .

- (void)awakeFromNib {
    // Initialization code
    self.separatorInset = UIEdgeInsetsMake(0, 10000, 0, 0);
    //self.layoutMargins = UIEdgeInsetsZero;
    [self setBackgroundColor:[UIColor clearColor]];
    [self setSelectionStyle:UITableViewCellSelectionStyleNone];
}

Définissez également la marge de mise en page UITableView comme suit

tblSignup.layoutMargins = UIEdgeInsetsZero;
1
Coder_A_D

Essayez le code ci-dessous, peut vous aider à résoudre votre problème

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

   NSString* reuseIdentifier = @"Contact Cell";

    UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    if (nil == cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier];
if (indexPath.row != 10) {//Specify the cell number
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithLine.png"]];

} else {
        cell.backgroundView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"bgWithOutLine.png"]];

}

    }

    return cell;
}
1
Nakkeeran

Mon exigence était de cacher le séparateur entre la 4ème et la 5ème cellule. Je l'ai atteint par

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if(indexPath.row == 3)
    {
        cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
    }
}
1
SMS

Le meilleur moyen d'y parvenir est de désactiver les séparateurs de ligne par défaut, la sous-classe UITableViewCell, et d'ajouter un séparateur de ligne personnalisé en tant que sous-vue de la contentView - voir ci-dessous une cellule personnalisée utilisée pour présenter un objet de type SNStock ayant deux propriétés de chaîne, ticker et name

import UIKit

private let kSNStockCellCellHeight: CGFloat = 65.0
private let kSNStockCellCellLineSeparatorHorizontalPaddingRatio: CGFloat = 0.03
private let kSNStockCellCellLineSeparatorBackgroundColorAlpha: CGFloat = 0.3
private let kSNStockCellCellLineSeparatorHeight: CGFloat = 1

class SNStockCell: UITableViewCell {

  private let primaryTextColor: UIColor
  private let secondaryTextColor: UIColor

  private let customLineSeparatorView: UIView

  var showsCustomLineSeparator: Bool {
    get {
      return !customLineSeparatorView.hidden
    }
    set(showsCustomLineSeparator) {
      customLineSeparatorView.hidden = !showsCustomLineSeparator
    }
  }

  var customLineSeparatorColor: UIColor? {
   get {
     return customLineSeparatorView.backgroundColor
   }
   set(customLineSeparatorColor) {
     customLineSeparatorView.backgroundColor = customLineSeparatorColor?.colorWithAlphaComponent(kSNStockCellCellLineSeparatorBackgroundColorAlpha)
    }
  }

  required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  init(reuseIdentifier: String, primaryTextColor: UIColor, secondaryTextColor: UIColor) {
    self.primaryTextColor = primaryTextColor
    self.secondaryTextColor = secondaryTextColor
    self.customLineSeparatorView = UIView(frame:CGRectZero)
    super.init(style: UITableViewCellStyle.Subtitle, reuseIdentifier:reuseIdentifier)
    selectionStyle = UITableViewCellSelectionStyle.None
    backgroundColor = UIColor.clearColor()

    contentView.addSubview(customLineSeparatorView)
    customLineSeparatorView.hidden = true
  }

  override func prepareForReuse() {
    super.prepareForReuse()
    self.showsCustomLineSeparator = false
  }

  // MARK: Layout

  override func layoutSubviews() {
    super.layoutSubviews()
    layoutCustomLineSeparator()
  }

  private func layoutCustomLineSeparator() {
    let horizontalPadding: CGFloat = bounds.width * kSNStockCellCellLineSeparatorHorizontalPaddingRatio
    let lineSeparatorWidth: CGFloat = bounds.width - horizontalPadding * 2;
    customLineSeparatorView.frame = CGRectMake(horizontalPadding,
      kSNStockCellCellHeight - kSNStockCellCellLineSeparatorHeight,
      lineSeparatorWidth,
      kSNStockCellCellLineSeparatorHeight)
  }

  // MARK: Public Class API

  class func cellHeight() -> CGFloat {
    return kSNStockCellCellHeight
  }

  // MARK: Public API

  func configureWithStock(stock: SNStock) {
    textLabel!.text = stock.ticker as String
    textLabel!.textColor = primaryTextColor
    detailTextLabel!.text = stock.name as String
    detailTextLabel!.textColor = secondaryTextColor
    setNeedsLayout()
  } 
}

Pour désactiver le séparateur de ligne par défaut, utilisez tableView.separatorStyle = UITableViewCellSeparatorStyle.None;. Le côté consommateur est relativement simple, voir exemple ci-dessous:

private func stockCell(tableView: UITableView, indexPath:NSIndexPath) -> UITableViewCell {
  var cell : SNStockCell? = tableView.dequeueReusableCellWithIdentifier(stockCellReuseIdentifier) as? SNStockCell
  if (cell == nil) {
    cell = SNStockCell(reuseIdentifier:stockCellReuseIdentifier, primaryTextColor:primaryTextColor, secondaryTextColor:secondaryTextColor)
  }
  cell!.configureWithStock(stockAtIndexPath(indexPath))
  cell!.showsCustomLineSeparator = true
  cell!.customLineSeparatorColor = tintColor
  return cell!
}
1
Zorayr

Pour iOS7 et les versions ultérieures, la méthode la plus propre consiste à utiliser INFINITY au lieu de la valeur codée en dur. Vous n'avez pas à vous soucier de la mise à jour de la cellule lorsque l'écran pivote.

if (indexPath.row == <row number>) {
    cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}
1
Xchord

Comme (beaucoup) d’autres l’ont déjà souligné, vous pouvez facilement masquer les séparateurs tous UITableViewCell en les désactivant simplement pour l’ensemble de UITableView; par exemple dans votre UITableViewController

- (void)viewDidLoad {
    ...
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    ...
}

Malheureusement, c’est un vrai PITA à faire par cellule, et c’est ce que vous demandez vraiment.

Personnellement, j’ai essayé de nombreuses permutations pour changer le cell.separatorInset.left, encore une fois, comme (beaucoup) d’autres l'ont suggéré, mais le problème est, pour citer Apple (souligné par moi):

"... Vous pouvez utiliser cette propriété pour ajouter un espace entre le contenu de la cellule en cours et les bords gauche et droit de la table. Les valeurs d'insertion positives se déplacent le contenu de la cellule} et la cellule séparateur vers l'intérieur et loin des bords de la table ... "

Ainsi, si vous essayez de "masquer" le séparateur en le déplaçant vers la droite, vous pouvez également indenter le contenu de votre cellule. Comme suggéré par crifan, vous pouvez alors essayer de compenser cet effet secondaire désagréable en définissant correctement cell.indentationWidth et cell.indentationLevel pour tout déplacer en arrière, mais j’ai également constaté que cela n’était pas non plus fiable (contenu toujours indenté ...).

Le moyen le plus fiable que j'ai trouvé est de surcharger layoutSubviews dans une simple sous-classe UITableViewCell et de définir l'encart right de sorte qu'il frappe l'encadré gauche, le séparateur ayant une largeur égale à 0 et devant ainsi être invisible fait dans layoutSubviews pour gérer automatiquement les rotations]. J'ajoute également une méthode pratique à ma sous-classe pour l'activer.

@interface MyTableViewCellSubclass()
@property BOOL separatorIsHidden;
@end

@implementation MyTableViewCellSubclass

- (void)hideSeparator
{
    _separatorIsHidden = YES;
}

- (void)layoutSubviews
{
    [super layoutSubviews];

    if (_separatorIsHidden) {
        UIEdgeInsets inset = self.separatorInset;
        inset.right = self.bounds.size.width - inset.left;
        self.separatorInset = inset;
    }
}

@end

Avertissement: il n'y a pas de moyen fiable pour restaurer le texte inséré à droite original, vous ne pouvez donc pas «masquer» le séparateur, d'où la raison pour laquelle j'utilise une méthode hideSeparator irréversible (vs exposant separatorIsHidden). Veuillez noter que le paramètre separatorInset persiste dans les cellules réutilisées. Par conséquent, comme vous ne pouvez pas "dé-masquer", vous devez conserver ces cellules de séparateur masqué dans leur propre identificateur reuseIdentifier.

0
tiritea

Cela fonctionne pour moi lorsque j'utilise l'extension et que j'appelle dans layoutSubviews () pour mettre à jour immédiatement les vues de présentation.

extension UITableViewCell {

    func removeSeparator() {
        separatorInset = UIEdgeInsetsMake(0, bounds.size.width, 0, 0)
    }
}

override func layoutSubviews() {
    super.layoutSubviews()

    removeSeparator()
}
0
Top

Le code de toutes les réponses rendra le remplissage des cellules égal à zéro plutôt qu'à la valeur par défaut. J'ai vu le problème dans iOS 11 iPad Pro 12 ''

Mais j'ai une solution ("hack sale") qui consiste à faire une section vide qui fera que la ligne de séparation se cache.

Voici le code que j'ai utilisé:

typedef enum PXSettingsTableSections {
    PXSettingSectionInvite = 0,
    PXSettingSectionAccount,
    PXSettingSectionPrivacy,
    PXSettingSectionCreation,
    PXSettingSectionTest,
    PXSettingSectionAboutHide,  // invisble section just to hide separator Line
    PXSettingSectionFooterHide, // invisble section just to hide separator Line
    PXSettingSectionNumItems,
} PXSettingsTableSectionsType;


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return PXSettingSectionNumItems;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    switch (section) {
        case PXSettingSectionInvite: return 1;
        case PXSettingSectionAccount:return (isSocialLogin) ? 1 : 2;
        case PXSettingSectionPrivacy: return 1;
        case PXSettingSectionCreation: return 2;
        case PXSettingSectionTest: return 3;
        case PXSettingSectionAboutHide: return 3;
        default: return 0;
    }
}


- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    switch(section)
    {
        case PXSettingSectionInvite: return nil;
        case PXSettingSectionAccount: return @"Account";
        case PXSettingSectionPrivacy: return @"Privacy";
        case PXSettingSectionCreation: return @"Someting";
        case PXSettingSectionTest: return @"Test";
        case PXSettingSectionAboutHide: return @" ";
        case PXSettingSectionFooterHide: return @" ";
    }
    return nil;
}


- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section {

    UITableViewHeaderFooterView *header = (UITableViewHeaderFooterView *)view;
    if (section == PXSettingSectionFooterHide || section == PXSettingSectionAboutHide) {
        // [UIColor clearColor] will not work 
        [header.contentView setBackgroundColor:[UIColor whiteColor]];
    }
}


- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    // You can control here the size of one specific section
    if(section == PXSettingSectionAboutHide){
        return 0.0000001; //make it real small
    }
    return 45.0;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    switch(indexPath.section)
    {
        case PXSettingSectionInvite:
            return self.inviteCell;
        case PXSettingSectionAccount:
            if (isSocialLogin) {
                return self.myWalletCell;
            }
            switch(indexPath.row)
            {
                case 0: return self.changePasswordCell;
                case 1: return self.myWalletCell;
            }
        case PXSettingSectionPrivacy:
            switch(indexPath.row)
        {
            case 0: return self.privateAccountCell;
        }
        case PXSettingSectionCreation:
            switch(indexPath.row)
        {
            case 0: return self.videoResolutionCell;
            case 1: return self.selfieMirrorCell;
        }
        case PXSettingSectionTest:
            switch(indexPath.row)
        {
            case 0: return self.termsOfUseImageCell;
            case 1: return self.attributionCell;
            case 2: return self.aboutCell;
        }
        case PXSettingSectionAboutHide:{
            switch(indexPath.row)
            {
                case 0: return self.clearCacheCell;
                case 1: return self.feedbackCell;
                case 2: return self.logoutCell;
            }
        }
    }

    return self.emptyCell;
}
0
Tiago Mendes

À l'intérieur de la classe de cellules tableview. mettre ces lignes de code

separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)
0
M.Nadeeshan

Sur iOS9, le problème était que la modification des incrustations de séparateur affectait également le positionnement du label de texte et de détail.

Je l'ai résolu avec ça

override func layoutSubviews() {
    super.layoutSubviews()

    separatorInset = UIEdgeInsets(top: 0, left: layoutMargins.left, bottom: 0, right: width - layoutMargins.left)
}
0
Saren Inden

Définissez separatorInset.right = .greatestFiniteMagnitude sur votre cellulaire.

0
Matthew Korporaal

Si vous utilisez StoryBoard, vous pouvez simplement sélectionner TableView et sur "Seperator" le remplacer par "none"

 if you cant find the Seperator, Click here

0
Tommy