web-dev-qa-db-fra.com

Espace blanc avant la ligne de séparation dans mon TableView

J'ai une question à propos de UITableView ... J'ai un UITableViewController et j'ai créé une cellule personnalisée . Lorsque je visualise le tableau, je vois un petit espace blanc devant la ligne de séparation, comme vous pouvez le voir dans cette capture d'écran:

enter image description here

Pourquoi? C'est une visualisation par défaut? Puis-je changer quelque chose pour supprimer ce rembourrage blanc à gauche?

45
Safari

L'espace blanc de début est fourni par défaut dans iOS 7, même pour les cellules personnalisées.

Vérifiez cette propriété separatorInset de UITableviewCell pour supprimer/ajouter un espacement des blancs aux deux extrémités du séparateur de ligne de la cellule.

// Supprimer les espaces

cell.separatorInset = UIEdgeInsetsZero;

Alternativement, au niveau UITableView, vous pouvez utiliser cette propriété -

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {  // Safety check for below iOS 7 
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}

Mise à jour - Le code ci-dessous fonctionne sur iOS 7 et iOS 8:

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

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

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

Alternativement, vous pouvez également éditer ceci dans le constructeur d'interface (IB): 

  1. Allez à l'IB. 
  2. Sélectionnez Table View. 
  3. Ouvrez "Inspecteur d'attributs" à droite.
  4. Changez "Inserts de séparateur" de Par défaut en Personnalisé.
  5. Changez l'attribut "Gauche" de 15 à 0.

Cela a le même effet que la réponse de @ Ashok, mais n'exige pas l'écriture de code.

Mise à jour Fonctionne sur iOS 7 et 8

Mise à jour Fonctionne sur iOS 9

33
michaelavila

Utilisez le code ci-dessous pour supprimer le remplissage indésirable dans UITableView. Cela fonctionne à la fois sur IOS 8 et 7

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell     forRowAtIndexPath:(NSIndexPath *)indexPath
{

    if ([tableView respondsToSelector:@selector(setSeparatorInset:)])
    {
        [tableView setSeparatorInset:UIEdgeInsetsZero];
    } 

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

    if ([cell respondsToSelector:@selector(setLayoutMargins:)])
    {
        [cell setLayoutMargins:UIEdgeInsetsZero];
    }
}
16
Anooj VM

Il n'y a pas d'espace blanc! Je suis entré dans un bogue à ce sujet, Apple vient de le fermer comme "pas un bogue", mais il m'a dit pourquoi ce n'est pas un bogue. J'ai écrit un projet simple qui définit une couleur pour chaque vue possible dans l'application. Ce que je vois, c’est que la couleur de ces pixels est en réalité la couleur d’arrière-plan de la cellule elle-même (et non la contentsView!), Comme Apple me l’avait dit.

Cell.contentView.backgroundColor est vert et la couleur de cell.background est rouge (pris avec Pixie):

enter image description here

Au final, sans séparateur, cell.contentView remplit complètement la cellule. Avec un séparateur, il y a un pixel ou deux espaces en bas. Le séparateur, lorsqu'il est inséré, remplit la majeure partie de l'espace, mais certains pixels de la cellule apparaissent ensuite.

Mystère résolu!

EDIT: Il semble que, selon la manière dont vous configurez votre Storyboard, le contentView.backgroundColor soit "perdu" ou défini sur Blanc. Si vous en faites trop lorsque vous fournissez des cellules, vous pouvez obtenir le comportement souhaité:

    let cell = tableView.dequeueReusableCellWithIdentifier("FOO", forIndexPath: indexPath) as UITableViewCell

    cell.backgroundColor = UIColor.redColor()
    cell.contentView.backgroundColor = UIColor.greenColor()
10
David H

Rapide

cell.separatorInset = UIEdgeInsetsMake(0, 0, cell.frame.size.width, 0)
if (cell.respondsToSelector("preservesSuperviewLayoutMargins")){
        cell.layoutMargins = UIEdgeInsetsZero
        cell.preservesSuperviewLayoutMargins = false
   }

Celui-ci a fonctionné pour moi 

Merci

Cela a fait le tour pour moi:

cell?.layoutMargins = UIEdgeInsetsZero;
cell?.preservesSuperviewLayoutMargins = false
7
lg365

Pour ceux d'entre vous qui souhaitent conserver les paramètres UIEdgeInsetS dans Swift et n'utilisent pas les Storyboards

Avant: (comportement par défaut)

Before, Default Setting__extrait de code__

Add the following code:

tableView.separatorInset.right = tableView.separatorInset.left

After, Implemented

5
ericgu

Voici une extension de UITableViewCell Class pour Swift 3 et versions ultérieures

extension UITableViewCell
{
    func removeSeparatorLeftPadding() -> Void
    {
        if self.responds(to: #selector(setter: separatorInset)) // Safety check
        {
            self.separatorInset = UIEdgeInsets.zero
        }
        if self.responds(to: #selector(setter: layoutMargins)) // Safety check
        {
            self.layoutMargins = UIEdgeInsets.zero
        }
    }
}

Usage: 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "menuCellID")!
    // .. Your other code
    cell.removeSeparatorLeftPadding()
    return cell
}

J'espère que cela aide quelqu'un!

Naresh.

0
Naresh Reddy M