Masquer la ligne de séparation sur une UITableViewCell

250

Je personnalise un fichier UITableView. Je veux masquer la ligne séparant la dernière cellule ... puis-je faire cela?

Je sais que je peux le faire tableView.separatorStyle = UITableViewCellStyle.Nonemais cela affecterait toutes les cellules de la tableView. Je veux que cela n'affecte que ma dernière cellule.

Safari
la source
1
Duplication possible de Y a
Sruit A.Suk du
Votre question a répondu à la mienne. tableView.separatorStyle = UITableViewCellStyle.None n'était la ligne dont j'avais besoin
Malachi Holden

Réponses:

371

dans viewDidLoad, ajoutez cette ligne:

self.tableView.separatorColor = [UIColor clearColor];

et dans cellForRowAtIndexPath:

pour les versions inférieures d'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 les versions supérieures d'iOS 7 (y compris iOS 8)

if (indexPath.row == self.newCarArray.count-1) {
    cell.separatorInset = UIEdgeInsetsMake(0.f, cell.bounds.size.width, 0.f, 0.f);
}
Hiren
la source
4
Cela fonctionnera sur iOS7 et iOS8. Il réduit efficacement le séparateur à zéro. cell.separatorInset = UIEdgeInsetsMake (0, CGRectGetWidth (cell.bounds) /2.0, 0, CGRectGetWidth (cell.bounds) /2.0)
Harris
9
Un rappel: lorsque votre iDevice est iPad et que la cellule est utilisée AutoLayout, la valeur renvoyée par "cell.bounds.size.width" peut ne pas être égale à la largeur réelle de la cellule. J'utilise donc toujours "tableView.frame.size.width" au lieu de "cell.bounds.size.width".
Veight Zhou
5
Remarque: vous devez utiliser à la [cell.contentView addSubview:line]place de[cell addSubview:line]
Anastasia
6
change cell.separatorInset l'encart gauche modifie également l'encart gauche du contenu de la cellule. Pas seulement la ligne de séparation. D'après apple doc: "Vous pouvez utiliser cette propriété pour ajouter de l'espace entre le contenu de la cellule actuelle et les bords gauche et droit du tableau. Les valeurs d'encart positives déplacent le contenu et le séparateur de cellule vers l'intérieur et loin des bords du tableau."
zgjie
9
Mauvaise idée. Vous ne devez jamais ajouter de sous-vues à une cellule dans cellForRowAtIndexPath. N'oubliez pas que les cellules sont réutilisées. Chaque fois que cette cellule est réutilisée, vous ajoutez une autre vue de ligne de séparation. Sur les grandes listes, cela peut affecter les performances de défilement. Et ce n'est tout simplement pas la bonne façon de procéder.
Dave Batton
247

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)

pour montrer 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);
}
Avinash
la source
Ne fonctionne pas pour un groupe UITableView, contrairement à la réponse acceptée.
Aleks N.19
3
Cela ne fonctionne pas pour iOS9, a self.tableView.separatorColor = [UIColor clearColor];résolu le problème .
Ben
1
C'est un hack complet mais ce qui fonctionne dans iOS 9 est: cell.layoutMargins = UIEdgeInsetsZero; cell.separatorInset = UIEdgeInsetsMake (0, 0, 0, 9999)
Pat Niemeyer
Voici comment cela fonctionne pour moi dans iOS 8+: cell.separatorInset = UIEdgeInsetsMake(0.f, 0.f, 0.f, cell.bounds.size.width-cell.layoutMargins.left);si je ne soustrais pas la valeur cell.layoutMargins.left, la ligne de séparation est tracée de la bordure gauche à la marge gauche (si vous en avez).
Alexandre OS
3
Cela pousse n'importe quel textLabelécran.
aehlke
99

Pour donner suite à la réponse d' Hiren .

dans ViewDidLoad et la ligne suivante:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

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

Constructeur d'interface

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 du résultat où j'affiche une table avec des cellules dynamiques (mais n'en ai qu'une seule avec son contenu). Le résultat étant que seul celui-ci a un séparateur et pas tous les "factices" ajoutent automatiquement la table pour remplir l'écran.

entrez la description de l'image ici

J'espère que cela t'aides.

EDIT: Pour ceux qui ne lisent pas toujours les commentaires, il y a en fait une meilleure façon de le faire avec quelques lignes de code:

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.tableFooterView = UIView()
}
Benjamin
la source
Je pense que pour cacher la ligne de séparation, c'est la bonne approche. self.tableView.separatorStyle = .none
arango_86
52

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 n'est cependant disponible qu'à partir d'iOS 7.

Kemenaran
la source
8
separatorInsetsemble insérer le contenu des cellules ainsi que le séparateur, nécessitant un autre hack pour compenser:cell.IndentationWidth = -10000;
crishoj
23
Une meilleure méthode consiste à définir separatorInset0 pour le haut, la gauche et le bas et la largeur de la cellule pour la droite: cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, cell.bounds.size.width); cela évite d'avoir à ajuster les autres propriétés de la cellule.
bryguy1300
Si vous utilisez la largeur des limites de cellule pour l'encart, vous devrez peut-être recalculer lorsque l'interface pivote.
AndrewR
Notez que si la cellule à laquelle vous effectuez cette opération est réutilisée pour dessiner une autre cellule pour laquelle vous n'aviez pas l'intention de masquer le séparateur, le séparateur en sera également supprimé.
Michael Peterson
1
UIEdgeInsetsMake (0, 10000, 0, 0); travaillé -> UIEdgeInsetsMake (0, 0, 0, cell.bounds.size.width); non. Je suppose que c'est parce que j'ai l'habitude désagréable de conserver des vcs de 3,5 pouces dans les xibs et les tableaux de bord, ce qui provoque des artefacts sur des appareils de 4 pouces et plus. (voix yoda) et très moche c'est!
Anton Tropashko
29

mon environnement de développement est

  • Xcode 7.0
  • 7A220 Swift 2.0
  • iOS 9.0

les réponses ci-dessus ne fonctionnent pas pleinement pour moi

après essai, ma solution finalement fonctionnelle est:

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: entrez la description de l'image ici

crifan
la source
20

Installez- separatorInset.right = .greatestFiniteMagnitudevous sur votre portable.

Matthew Korporaal
la source
appeler cela awakeFromNibpeut faire clignoter tout l'écranapplicationDidBecomeActive
Breadbin
Cela fonctionne sur iOS 12.2, sur l'appareil, à partir de la création UITableViewCell programmatique. Agréable.
Womble
La définition du bon séparateur a fonctionné pour moi lorsque je le configure dans cellForRowAt. Les meilleures solutions. Cela fonctionne d'iOS 10 à 13 pour moi. Testé sur iOS 10, 12 et 13. Lorsque la marge gauche est définie, cela ne fonctionne pas pour iOS 10.
Ariel Bogdziewicz
18

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

extension UITableViewCell {
  func separator(hide: Bool) {
    separatorInset.left = hide ? bounds.size.width : 0
  }
}

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

cell.separator(hide: false) // Shows separator 
cell.separator(hide: true) // Hides separator

Il est vraiment préférable d'attribuer la largeur de la cellule de la vue de table comme encart gauche au lieu de lui attribuer un nombre aléatoire. Parce que dans certaines dimensions d'écran, peut-être pas maintenant, mais à l'avenir, vos séparateurs peuvent toujours être visibles car ce nombre aléatoire peut ne pas être suffisant. De plus, dans l'iPad en mode paysage, vous ne pouvez pas garantir que vos séparateurs seront toujours invisibles.

Okhan Okbay
la source
Cela ne fonctionne pas pour UITableView de style groupé. Avez-vous une solution pour les cas groupés?
zslavman
8

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 pour la constante d'encart gauche ou calculez-la à la volée. Si vous essayez de définir l'encart droit, vous avez une partie visible du séparateur sur le côté gauche de la cellule sur iOS 8.

Sound Blaster
la source
1
Pourquoi utiliser un nombre aléatoire lorsque vous pouvez faire quelque chose comme ceci: MAX ([[UIScreen mainScreen] bounds] .size.width, [[UIScreen mainScreen] bounds] .size.height); pour être sûr que
ça a
7

Dans iOS 7, le séparateur de cellules de style groupé UITableView est un peu différent. Cela ressemble un peu à ceci:

entrez la description de l'image ici

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

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

Mais cela ne semble pas fonctionner pour moi. Je ne sais pas pourquoi. J'ai donc décidé d'utiliser la réponse de Hiren , mais en utilisant à la UIViewplace 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 l'utilisez, assurez-vous de brancher la hauteur de vue de table correcte dans la seconde instruction if. J'espère que cela est utile pour quelqu'un.

Enrico Susatyo
la source
7

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
        }
    }
}
Tualatrix Chou
la source
aucune des solutions ci-dessus n'a fonctionné, cela fonctionne sur ios 12
Abdul Waheed
Cela pourrait être rejeté par l'App Store pour accéder aux API privées.
Elliot Fiske
5

Je ne pense pas que cette approche fonctionnera en aucun cas avec des cellules dynamiques ...

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

Peu importe la méthode de visualisation de table dans laquelle vous le faites pour les cellules dynamiques, la cellule sur laquelle vous avez modifié la propriété en incrustation aura toujours la propriété en incrustation définie à chaque fois qu'elle est retirée de la file d'attente, ce qui provoque un déchaînement de séparateurs de ligne manquants ... jusqu'à ce que vous changez-le vous-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 la structure de vos données à chaque chargement

Greg Price
la source
4

Dans Swift avec 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 ci-dessus fonctionnera sur UITableView à l'aide de cellules dynamiques. Le seul problème que vous pouvez rencontrer est lorsque vous utilisez des cellules statiques avec des catégories, un type de séparateur différent de aucun et un style groupé pour la vue de table. En fait, dans ce cas particulier, il ne masquera pas la dernière cellule de chaque catégorie. Pour surmonter cela, la solution que j'ai trouvée était de définir le séparateur de cellules (via IB) sur aucun, puis de créer et d'ajouter manuellement (via le code) votre vue de ligne à chaque cellule. Pour un exemple, veuillez consulter 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)
    }
}
Roi-sorcier
la source
Dans mon projet, cela fonctionne pour les cellules statiques mais pas pour les cellules dynamiques. Dans ce dernier cas, le contenu de la dernière cellule est décalé vers la droite (tout comme la ligne de séparation). Des idées, pourquoi cela pourrait-il arriver?
Bastian
Le premier extrait de la réponse ci-dessus fonctionnera sur UITableView à l'aide de cellules dynamiques. Le seul problème que vous pouvez rencontrer est lorsque vous utilisez des cellules statiques avec des catégories, un type de séparateur différent de aucun et un style groupé pour la vue tableau. En fait, dans ce cas particulier, il ne masquera pas la dernière cellule de chaque catégorie. Pour surmonter cela, la solution que j'ai trouvée était de définir le séparateur de cellules (via IB) sur aucun, puis de créer et d'ajouter manuellement (via le code) votre vue de ligne à chaque cellule. Pour un exemple, veuillez vérifier le deuxième extrait de la réponse ci-dessus.
King-Wizard
ça déplace le texte (titre), donc inutile!
user155
4

Utilisez cette sous-classe, l'ensemble separatorInsetne fonctionne 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

liruqi
la source
4

Le plus simple et logique est de le faire:

- (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 tableCiewCell. Et cette approche ne supprime que le dernier séparateur tableViewCell, et vous n'avez pas besoin de penser aux problèmes de mise en page automatique (c'est-à-dire le périphérique rotatif) ou aux valeurs de code fixe pour configurer des insertions de séparateur.

rostislawk
la source
1
Bienvenue dans Stack Overflow! Une meilleure réponse pour les futurs lecteurs expliquerait pourquoi c'est plus simple et plus logique.
CGritton
une belle solution!
geek1706
3

Dans willdisplaycell:

cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0)
Kimate Richards
la source
3

En utilisant Swift 3 et en adoptant la méthode de piratage la plus rapide, vous pouvez améliorer le code à l'aide d' 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
    }
}
Luca Davanzo
la source
2
  if([_data count] == 0 ){
       [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];//  [self tableView].=YES;
    } else {
      [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];////    [self tableView].hidden=NO;
    }
Gank
la source
2

La meilleure façon d'y parvenir est de désactiver les séparateurs de ligne par défaut, la sous UITableViewCell- classe et d'ajouter un séparateur de ligne personnalisé en tant que sous-vue du contentView- voir ci-dessous une cellule personnalisée qui est utilisée pour présenter un objet de type SNStockqui a deux propriétés de chaîne, tickeret 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 l'utilisation du séparateur de ligne par défaut, tableView.separatorStyle = UITableViewCellSeparatorStyle.None;. Le côté consommateur est relativement simple, voir l'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!
}
Zorayr
la source
2

Pour Swift 2:

ajoutez la ligne suivante à viewDidLoad():

tableView.separatorColor = UIColor.clearColor()
Sébastien
la source
2

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

debiasej
la source
1

Essayez le code ci-dessous, pourrait 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;
}
Nakkeeran
la source
1
- (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);
       }
}
Adobels
la source
1

Vous devez prendre une cellule personnalisée et ajouter une étiquette et définir une contrainte telle que l'étiquette doit couvrir toute la zone de la cellule. et écrivez la ligne ci-dessous dans le constructeur.

- (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;
Coder_A_D
la source
1

Je n'ai pas pu masquer le séparateur sur une cellule spécifique, sauf en utilisant 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];
        }
    }
}
Mahmoud Adam
la source
1

Pour iOS7 et supérieur, la méthode la plus propre consiste à utiliser INFINITY au lieu d'une valeur codée en dur. Vous n'avez pas à vous soucier de mettre à jour la cellule lorsque l'écran tourne.

if (indexPath.row == <row number>) {
    cell.separatorInset = UIEdgeInsetsMake(0, INFINITY, 0, 0);
}
Xchord
la source
3
Soyez averti: l'utilisation d'INFINITY provoque une exception d'exécution sur iOS9
AndrewR
1

Comme (beaucoup) d'autres l'ont souligné, vous pouvez facilement masquer tous les séparateurs UITableViewCell en les désactivant simplement pour l'ensemble de UITableView lui-même; par exemple dans votre UITableViewController

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

Malheureusement, c'est un vrai PITA à faire sur une cellule , 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 ( souligne):

" ... Vous pouvez utiliser cette propriété pour ajouter de l'espace entre le contenu de la cellule actuelle et les bords gauche et droit du tableau. Les valeurs d'encart positives déplacent le contenu et le séparateur de cellule vers l'intérieur et loin des bords du tableau ... "

Donc, si vous essayez de «masquer» le séparateur en le poussant hors écran vers la droite, vous pouvez également finir par indenter le contenu de votre cellule. Comme suggéré par crifan, vous pouvez ensuite essayer de compenser cet effet secondaire désagréable en réglant cell.indentationWidthetcell.indentationLevel en déplaçant tout de manière appropriée, mais j'ai trouvé que cela n'était pas non plus fiable (le contenu est toujours en retrait ...).

Le moyen le plus fiable que j'ai trouvé est de layoutSubviewscontourner une simple sous-classe UITableViewCell et de définir l' encart droit pour qu'il frappe l'encart gauche, ce qui rend le séparateur de largeur 0 et donc invisible [cela doit être fait dans layoutSubviews pour automatiquement gérer 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

Mise en garde: il n'y a pas de moyen fiable de restaurer l' encart droit d' origine , vous ne pouvez donc pas `` masquer '' le séparateur, c'est pourquoi j'utilise une hideSeparatorméthode irréversible (vs exposer separatorIsHidden). Veuillez noter que separatorInset persiste à travers les cellules réutilisées, donc, comme vous ne pouvez pas «dé-masquer», vous devez garder ces cellules de séparation cachées isolées dans leur propre réutilisationIdentifier.

tiritea
la source
1

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

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

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;
}
RyuX51
la source
1

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

separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: self.bounds.size.width)
M.Nadeeshan
la source
Ne tient pas compte des modifications de la disposition de l'appareil / de la scène.
Womble
0

Sur iOS9, j'ai eu le problème que le changement des insertions de séparateur affecte également le positionnement du texte et de l'étiquette 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)
}
Saren Inden
la source
Ne fonctionne pas avec la classe UITableViewCell - TextLabel et DetailedTextLabel s'éloignent de la cellule.
Nik Kov