web-dev-qa-db-fra.com

Éliminer les séparateurs supplémentaires sous UITableView

Lorsque je configure une vue sous forme de tableau avec 4 lignes, il reste des lignes de séparateur supplémentaires (ou des cellules vides supplémentaires) sous les lignes remplies.

Comment pourrais-je enlever ces cellules?

 image for extra separator lines in UITableView

645
RoundOutTooSoon

Générateur d'interface (iOS 9+)

Il suffit de faire glisser UIView vers la table. Dans le storyboard, il sera placé en haut, sous vos cellules personnalisées. Vous préférerez peut-être l'appeler "pied de page".

Ici, il est affiché en vert pour plus de clarté, vous voudrez probablement une couleur claire.

Notez qu'en ajustant la hauteur, vous pouvez affecter le traitement du "rebond du bas" de la table, selon vos préférences. (La hauteur zéro est généralement bonne).

 enter image description here


Pour le faire par programme: 

Rapide

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

Objectif c

iOS 6.1+

- (void)viewDidLoad 
{
    [super viewDidLoad];

    // This will remove extra separators from tableview
    self.tableView.tableFooterView = [UIView new];
}

ou si vous préférez,

    self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];

Historiquement sous iOS:

Ajouter au contrôleur de vue de table ...

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
     // This will create a "invisible" footer
     return CGFLOAT_MIN;
 }

et si nécessaire ...

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{        
    return [UIView new];

    // If you are not using ARC:
    // return [[UIView new] autorelease];
}
1410
J. Costa

Voici une autre façon de faire cela avec le style de table groupée, et une autre que vous ne devineriez probablement pas. Ajouter un en-tête et pied de page à la table (peut-être que l'un ou l'autre suffit, n'ont pas vérifié) les séparateurs disparaissent des lignes de remplissage/vides.

Je suis tombé dessus parce que je voulais un peu d’espace en haut et en bas des tables pour réduire le risque de toucher des boutons au lieu d’une cellule de table avec des doigts charnus. Voici une méthode pour coller une vue vierge comme en-tête et pied de page. Utilisez la hauteur que vous souhaitez, vous éliminez toujours les lignes de séparation supplémentaires.

- (void) addHeaderAndFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.myTableView setTableHeaderView:v];
    [self.myTableView setTableFooterView:v];
    [v release];
}

En réponse à @Casebash, je suis retourné au code de mon application ("AcmeLists" List Manager dans iTunes Store ...) et j'ai court-circuité la méthode addHeaderAndFooter pour la vérifier. Sans lui, j'ai les séparateurs de lignes supplémentaires; avec le code, j'ai ce que vous voyez dans cette fenêtre snap: pas de séparateurs de lignes de tableau image . Donc, je ne suis pas sûr de savoir pourquoi cela n’aurait pas fonctionné pour vous. De plus, il est logique pour moi d’avoir un pied de page personnalisé dans une vue tableau qui doit nécessairement cesser de dessiner des séparateurs de lignes pour les lignes vides situées en dessous. Ce serait hideux. Pour référence, j'ai regardé les tables où il y avait plus de lignes que ce qui pouvait être visualisé à l'écran, puis une table avec deux lignes. Dans les deux cas, pas de séparateurs étrangers.

Peut-être que vos vues personnalisées n'ont pas été réellement ajoutées. Pour vérifier cela, définissez la couleur d'arrière-plan sur une valeur autre que clearColor, par exemple [UIColor redColor]. Si vous ne voyez pas de barres rouges au bas de la table, votre pied de page n'était pas défini.

128
wkw

Suppression de lignes de séparation supplémentaires pour les lignes vides dans UITableView dans Swift

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    self.yourTableview.tableFooterView = UIView()
}
57
dineshthamburu

Je voudrais prolonger wkw answer:

Le simple fait d'ajouter que le pied de page de hauteur 0 fera l'affaire. (testé sur sdk 4.2, 4.4.1)

- (void) addFooter
{
    UIView *v = [[UIView alloc] initWithFrame:CGRectZero];

    [self.myTableView setTableFooterView:v];
}

ou encore plus simple - lorsque vous configurez votre tableview, ajoutez cette ligne:

//change height value if extra space is needed at the bottom.
[_tableView setTableFooterView:[[UIView alloc] initWithFrame:CGRectMake(0,0,0,0)]];

ou encore plus simple - pour supprimer simplement les séparateurs:

[_tableView setTableFooterView:[UIView new]];

Merci à wkw again :)

36
Guntis Treulands

Pour iOS 7+ à l'aide de Storyboards

Faites simplement glisser une UIView dans votre UITableView en tant que pied de page. Définissez la hauteur de la vue de pied de page sur 0.

22
Kyle Clegg

Essaye ça. Cela a fonctionné pour moi: 

- (void) viewDidLoad
{
  [super viewDidLoad];

  // Without ARC
  //self.tableView.tableFooterView = [[[UIView alloc] init] autorelease];

  // With ARC, tried on Xcode 5
  self.tableView.tableFooterView = [UIView new];
}
18
Ambili B Menon

Pour Swift:

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.tableFooterView = UIView()
    }
12
Sebastian

Vous pouvez simplement ajouter un pied de page vide à la fin, ce qui masquera les cellules vides, mais il aura également un aspect assez moche:

tableView.tableFooterView = UIView()

 enter image description here

Il existe une meilleure approche: ajoutez une ligne de 1 point à la fin de la vue du tableau car le pied de page et les cellules vides ne seront plus affichés.

let footerView = UIView()
footerView.frame = CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1)
footerView.backgroundColor = tableView.separatorColor
tableView.tableFooterView = footerView

 enter image description here

8
Darko

Si vous utilisez Swift, ajoutez le code suivant à viewDidLoad du contrôleur qui gère la vue de table:

override func viewDidLoad() {
    super.viewDidLoad()

    //...

    // Remove extra separators
    tableView.tableFooterView = UIView(frame: CGRectZero)
}

Pour Swift 4.0, CGRectZero est obsolète, vous devez donc utiliser CGRect.zero

8
Babatunde Adeyemi

Faire avancer la solution de J. Costa: Vous pouvez apporter un changement global à la table en mettant cette ligne de code:

[[UITableView appearance] setTableFooterView:[[UIView alloc] initWithFrame:CGRectZero]];

dans la première méthode possible (généralement dans AppDelegate, dans: méthode application:didFinishLaunchingWithOptions:).

7
o.shnn

Je sais que cette question doit être acceptée, mais je mets ici différentes façons de masquer la ligne de séparation supplémentaire de UITableView.

Vous pouvez masquer la ligne de séparateur standard de tableView et ajouter votre ligne personnalisée en haut de chaque cellule.

Mettre à jour:  

Le moyen le plus simple d’ajouter un séparateur personnalisé est d’ajouter une simple variable UIView de hauteur 1px:

UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 1)];
separatorLineView.backgroundColor = [UIColor grayColor]; /// may be here is clearColor;
[cell.contentView addSubview:separatorLineView];

OU

    self.tblView=[[UITableView alloc] initWithFrame:CGRectMake(0,0,320,370) style:UITableViewStylePlain];
    self.tblView.delegate=self;
    self.tblView.dataSource=self;
    [self.view addSubview:self.tblView];

    UIView *v = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 10)];
    v.backgroundColor = [UIColor clearColor];
    [self.tblView setTableHeaderView:v];
    [self.tblView setTableFooterView:v];
    [v release];

OU

- (float)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    // This will create a "invisible" footer
    return 0.01f;
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    // To "clear" the footer view
    return [[UIView new] autorelease];
}

OU La meilleure et simple façon que j'aime est 

self.tableView.tableFooterView = [[UIView alloc] init];

Essayez n'importe lequel.

6
iPatel

il suffit d’ajouter ce code ( Swift ). .

tableView.tableFooterView = UIView()
6
roy

ligne de séparateur supplémentaire uitableview masquer lignes de séparateur supplémentaire

 self.tbltableView.tableFooterView = UIView(frame: .zero)
5
Parth Changela

J'utilisais une vue sous forme de tableau pour afficher un nombre fixe de lignes de hauteur fixe. Je l'ai donc simplement redimensionnée et rendue non-défilable.

5
Casebash

Swift fonctionne très bien avec:

tableView.tableFooterView = UIView()
4
Marcelo Gracietti

Si vous ne souhaitez pas de séparateur après la dernière cellule, vous avez besoin d'une hauteur proche de zéro mais non nulle pour votre pied de page.

Dans votre UITableViewDelegate:

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return .leastNormalMagnitude
}
4
Cœur

Ajoutez simplement une vue avec la couleur de séparation souhaitée comme couleur d’arrière-plan, 100% largeur, hauteur 1px à la position x0 y-1 de votre tableViewCell. Assurez-vous que la tableViewCell ne coupe pas les sous-vues, mais la table devrait. 

Ainsi, vous obtenez un séparateur absolut simple et fonctionnel uniquement entre les cellules existantes sans aucun hack par code ou par IB.

Remarque: sur le premier saut vertical, le 1er séparateur apparaît, mais cela ne devrait pas poser de problème, car il s'agit du comportement iOS par défaut.

4
maaalex

Vous pouvez trouver beaucoup de réponses à cette question. La plupart d’entre eux sont manipulés avec l’attribut UITableView de tableFooterView et c’est le moyen approprié de masquer les lignes vides. Pour plus de commodité, j'ai créé une extension simple qui permet d'activer/désactiver les lignes vides à partir d'Interface Builder. Vous pouvez le vérifier à partir de ce fichier Gist . J'espère que cela vous fera économiser un peu de temps.

extension UITableView {

  @IBInspectable
  var isEmptyRowsHidden: Bool {
        get {
          return tableFooterView != nil
        }
        set {
          if newValue {
              tableFooterView = UIView(frame: .zero)
          } else {
              tableFooterView = nil
          }
       }
    }
}

Usage:

tableView.isEmptyRowsHidden = true

 enter image description here

3

Pour éliminer par programme des lignes de séparateur supplémentaires du bas de UItableview, il suffit de noter les deux lignes de code suivantes pour en supprimer le séparateur supplémentaire.

tableView.sectionFooterHeight = 0.f;
tableView.sectionHeaderHeight = 0.f;

Cette astuce fonctionne pour moi tout le temps, essayez-vous.

3
Kalpesh Panchasara

Si vous n'avez qu'une seule section, le moyen le plus rapide et le plus simple consiste simplement à définir le style d'affichage de la table de «Ordinaire» à «Groupé». (voir image)

 TableView Grouped

Si vous avez plusieurs sections, vous devrez peut-être définir la hauteur de l'en-tête sur zéro (selon les goûts de votre/votre client/votre chef de projet).

Si vous avez plusieurs sections et que vous ne voulez pas déranger les en-têtes (même s'il ne s'agit que d'une ligne dans le cas le plus simple), vous devez définir un UIView comme pied de page, comme expliqué dans les réponses précédentes.

1
Gefilte Fish

Si vous souhaitez supprimer de l’espace non désiré dans UITableview, vous pouvez utiliser ci-dessous deux méthodes. 

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
    return 0.1;
}
1
Hari c

Swift 4.0 Extension

Juste une petite extension pour le storyboard:

 enter image description here

extension UITableView {
    @IBInspectable
    var hideSeparatorForEmptyCells: Bool {
        set {
            tableFooterView = newValue ? UIView() : nil
        }
        get {
            return tableFooterView == nil
        }
    }
}
1
Nik Kov

Rapide et facile Swift 4 way. 

override func viewDidLoad() {
     tableView.tableFooterView = UIView(frame: .zero)
}

Si vous rencontrez des cellules statiques. Vous pouvez également désactiver le séparateur à partir de la fenêtre Inspecteur. (ce ne sera pas souhaitable si vous avez besoin du séparateur. Dans ce cas, utilisez la méthode ci-dessus) inspector window

1
Alix

Essayez avec ça

pour Objectif C

- (void)viewDidLoad 
 {
  [super viewDidLoad];
  // This will remove extra separators from tableview
  self.yourTableView.tableFooterView = [UIView new];
}

pour Swift

override func viewDidLoad() {
 super.viewDidLoad()
 self.yourTableView.tableFooterView = UIView()
}
1
Atanu Mondal

J'ai eu un peu de chance en implémentant un seul morceau de la réponse acceptée (iOS 9+, Swift 2.2). J'avais essayé d'implémenter:

self.tableView.tableFooterView = UIView(frame: .zero)

Cependant, cela n’a eu aucun effet sur ma tableView - Je pense que cela peut avoir un lien avec le fait que j’utilisais UITableViewController.

Au lieu de cela, je n’ai eu qu’à redéfinir la méthode viewForFooterInSection (je n’ai pas défini la tableFooterView ailleurs):

override func tableView(tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
    return UIView(frame: .zero)
}

Cela a bien fonctionné pour une tableView avec une seule section (si vous avez plusieurs sections, vous devez spécifier la dernière).

1
BAP

J'ai ajouté cette petite extension tableview qui aide tout au long

extension UITableView {
     func removeExtraCells() {
         tableFooterView = UIView(frame: .zero)
     }
}
0
Suresh Varma

Si vous avez une searchbar dans votre view (pour limiter le nombre de résultats par exemple), vous devez également ajouter les éléments suivants dans shouldReloadTableForSearchString et shouldReloadTableForSearchScope:

controller.searchResultsTable.footerView = [ [ UIView alloc ] initWithFrame:CGRectZero ];
0
user3900346

UIKit ne crée pas de cellule vide lorsque tableView a une tableFooterView. Nous pouvons donc créer une astuce et attribuer un objet UIView de hauteur nulle au pied de la variable tableView.

tableView.tableFooterView = UIView()
0
iMuzahid

Essaye ça

self.tables.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 10.0f)];
0
vishnu

Dans Swift (j'utilise la version 4.0), vous pouvez y parvenir en créant une classe UITableViewCell personnalisée et overriding la méthode setSelected. Puis le separator insets all to 0 . (ma classe principale avec la vue de table a un fond clair) couleur.

override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // eliminate extra separators below UITableView
    self.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
}
0
chillbumps