web-dev-qa-db-fra.com

Comment supprimer la dernière bordure de la dernière cellule dans UITableView?

Dans mon application, j'utilise une UITableView Mon problème est que je veux supprimer la dernière bordure de la dernière cellule de UITableView.

Veuillez vérifier l'image suivante:

enter image description here

64
user2289379

Mis à jour le 14/09/15. Ma réponse d'origine est devenue obsolète, mais c'est toujours une solution universelle pour toutes les versions d'iOS:

Vous pouvez masquer la ligne de séparateur standard de tableView et ajouter votre ligne personnalisée en haut de chaque cellule. 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, cell.bounds.size.width, 1)];
separatorLineView.backgroundColor = [UIColor grayColor];
[cell.contentView addSubview:separatorLineView];

À ce jour, je souscris à d'une autre manière pour masquer les séparateurs supplémentaires sous les cellules (fonctionne pour iOS 6.1+):

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

La meilleure solution consiste à ajouter une vue de pied de page. Le code suivant cache parfaitement la ligne de la dernière cellule:

Objectif c

self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 1)];

Swift 4.0

tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 1))
117
Tonny Xu

Dans iOS 7, il existe une solution plus simple. La cellule supposée est votre dernière cellule:

cell.separatorInset = UIEdgeInsetsMake(0, cell.bounds.size.width, 0, 0);
39
davidisdk

Cela fonctionne pour moi dans iOS 7 et 8:

cell.separatorInset = UIEdgeInsetsMake(0, 0, 0, CGRectGetWidth(tableView.bounds));

REMARQUE: faites attention à utiliser tableView.bounds car il indique parfois une valeur incorrecte en fonction du moment où vous l'appelez. Voir Signaler des limites incorrectes en mode Paysage

13
Jamie Forrest

Ajoutez cette ligne de code dans viewDidLoad().

tableView.tableFooterView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: 0.001))

Cela garantit que le dernier séparateur sera remplacé et que la vue de pied de page invisible (invisible) n'occupera aucune hauteur supplémentaire. Étant donné que la largeur de la vue de pied de page sera gérée par UITableView, vous pouvez donc la définir sur 0.

3
Jonny

Voici le remède que j'utilise actuellement. ce n'est peut-être pas la meilleure approche, mais cela fonctionne.

Supprimer SeparatorColor et setSeparatorStyle pour créer un séparateur personnalisé

- (void)viewDidLoad
{
    [super viewDidLoad];

    ...

    [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    [self.tableView setSeparatorColor:[UIColor clearColor]];
}

Ajouter un séparateur personnalisé à chaque cellule avec un arrière-plan tableview

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

    ...

    UIView* separatorLineView = [[UIView alloc] initWithFrame:CGRectMake(0, cell.frame.size.height-1, 320, 1)];
    separatorLineView.backgroundColor = self.tableView.backgroundColor;
    [cell.contentView addSubview:separatorLineView];

    return cell;
}
2
rtato

Ma version courte:

self.tblView.tableFooterView = [UIView new];
2
Marco Mardegan

Non, vous ne pouvez pas faire ça. Ces séparateurs sont joliment coupés et secs, le style et la couleur sont corrects… .. Cependant, une solution alternative pourrait être de les désactiver tous ensemble et de définir une image d'arrière-plan avec une ligne horizontale au bas de toutes les cellules sauf la dernière.

EX:

    [tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    if (indexPath.row == [myArray count] - 1) {
        UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"myImage.png"]];
        [cell setBackgroundView:imageView];
    }
2
Mick MacCallum

Pour iOS 7 et supérieur

    -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
    {
        BOOL bIsLastRow = NO;

        //Add logic to check last row for your data source
        NSDictionary *dict = [_arrDataSource objectAtIndex:indexPath.section];
        if([_arrDataSource lastObject] == dict)
        {
           bIsLastRow = YES;
        }

        //Set last row separate inset left value large, so it will go outside of view
        if ([cell respondsToSelector:@selector(setSeparatorInset:)]) 
        {
            [cell setSeparatorInset:UIEdgeInsetsMake(0, bIsLastRow ? 1000 :0, 0, 0)];
        }
    }
1
Aditya Deshmane

Le code ci-dessous m'aide à supprimer le séparateur de la dernière ligne d'un UITableView.

Swift 3.0

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { if indexPath.row == tableView.numberOfRows(inSection: indexPath.section) { cell.separatorInset.right = cell.bounds.size.width } }

1
user2991638

En Swift simplement:

tableView.tableFooterView = UIView()
1
DungeonDev

Une autre option consiste à sous-classer UITableView

@synthesize hideLastSeparator = _hideLastSeparator;
@synthesize hideLastSeparatorView = _hideLastSeparatorView;
-(void)setHideLastSeparator:(BOOL)hideLastSeparator {
    if (_hideLastSeparator == hideLastSeparator) {
        return;
    }
    _hideLastSeparator = hideLastSeparator;
    if (_hideLastSeparator) {
        _hideLastSeparatorView = [[UIView alloc] initWithFrame:CGRectMake(0, self.contentSize.height, self.bounds.size.width, 0.5f)];
        _hideLastSeparatorView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
        _hideLastSeparatorView.backgroundColor = self.backgroundColor;
        [self addSubview:_hideLastSeparatorView];
        [self hideSeparator];
    }
    else {
        [_hideLastSeparatorView removeFromSuperview];
        _hideLastSeparatorView = nil;
    }
}
-(void)setContentSize:(CGSize)contentSize {
    [super setContentSize:contentSize];
    if (_hideLastSeparator) {
        [self hideSeparator];
    }
}
-(void)hideSeparator {
    CGRect frame = _hideLastSeparatorView.frame;
    frame.Origin.y = self.contentSize.height - frame.size.height;
    _hideLastSeparatorView.frame = frame;
}

Le .h ne doit contenir que des déclarations de propriétés pour hideLastSeparator et hideLastSeparatorView.
Si vous souhaitez masquer le séparateur, utilisez la nouvelle classe et définissez myTableView.hideLastSeparator = YES.
Cela fonctionne en obstruant le dernier séparateur en ajoutant une nouvelle vue dessus. 

C’est un peu plus facile à utiliser à mon avis (que d’utiliser un séparateur personnalisé ou de définir le dernier séparateur de la dernière cellule), et évite certaines animations étranges provoquées parfois par la méthode de définition de tableFooterView animations de table).

0
alex-i

Recherchez le dernier index de cellule dans le délégué cellForRow et placez la ligne de code ci-dessous:

cell.separatorInset = UIEdgeInsetsMake(
    0.f,
    40.0f,
    0.f,
    self.view.frame.size.width-40.0f
);
0
Suresh Kansujiya

_tableView.tableFooterView = [[UIView alloc]] initWithFrame: CGRectZero];

0
ohana

Solution basée sur extension pour Swift 4, testée sur iOS 12

J'ai remarqué que le fait de définir une vue vide de height = 1 supprime également le séparateur de la dernière cellule visible. Toutefois, la définition de height = 0 supprime simplement le séparateur des cellules vides.

extension UITableView {
    func removeSeparatorsOfEmptyCells() {
        tableFooterView = UIView(frame: .zero)
    }

    func removeSeparatorsOfEmptyCellsAndLastCell() {
        tableFooterView = UIView(frame: CGRect(Origin: .zero, size: CGSize(width: 0, height: 1)))
    }
}
0
fl034

Swift 4.2

Pour obtenir un séparateur allant de gauche à droite dans votre dernière cellule, ajoutez ceci dans votre implémentation UITableViewDataSource'stableView(_:cellForRowAt:):

if tableView.numberOfRows(inSection: indexPath.section) - 1 == indexPath.row {
        cell.separatorInset = .zero
}

Si vous ne voulez pas de séparateur pour une cellule particulière, envisagez de dessiner votre propre séparateur et définissez tableView.separatorStyle = .none.

0
JanApotheker