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:
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];
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))
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);
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
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.
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;
}
Ma version courte:
self.tblView.tableFooterView = [UIView new];
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];
}
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)];
}
}
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
}
}
En Swift simplement:
tableView.tableFooterView = UIView()
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).
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
);
_tableView.tableFooterView = [[UIView alloc]] initWithFrame: CGRectZero];
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)))
}
}
Swift 4.2
Pour obtenir un séparateur allant de gauche à droite dans votre dernière cellule, ajoutez ceci dans votre implémentation UITableViewDataSource's
tableView(_: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
.