iOS 8.0 introduit la propriété layoutMargins sur les cellules ET les vues de tableau.
Cette propriété n'est pas disponible sur iOS 7.0, vous devez donc vérifier avant de l'attribuer!
La solution simple consiste à sous-classer votre cellule et à remplacer la propriété des marges de disposition, comme suggéré par @ user3570727. Cependant, vous perdrez tout comportement du système comme l'héritage des marges de la zone sûre, donc je ne recommande pas la solution ci-dessous:
(Objectif c)
-(UIEdgeInsets)layoutMargins {
return UIEdgeInsetsZero // override any margins inc. safe area
}
(rapide 4.2):
override var layoutMargins: UIEdgeInsets { get { return .zero } set { } }
Si vous ne souhaitez pas remplacer la propriété ou devez la définir de manière conditionnelle, continuez à lire.
En plus de la layoutMargins
propriété, Apple a ajouté une propriété à votre cellule qui l'empêchera d'hériter des paramètres de marge de votre vue tabulaire. Lorsque cette propriété est définie, vos cellules sont autorisées à configurer leurs propres marges indépendamment de la vue de table. Considérez-le comme une dérogation.
Cette propriété est appelée preservesSuperviewLayoutMargins
et sa définition NO
permettra au layoutMargin
paramètre de la cellule de remplacer tout ce qui layoutMargin
est défini sur votre TableView. Il permet à la fois de gagner du temps ( vous n'avez pas à modifier les paramètres de la vue Table ) et est plus concis. Veuillez vous référer à la réponse de Mike Abdullah pour une explication détaillée.
REMARQUE: ce qui suit est une implémentation propre pour un paramètre de marge au niveau de la cellule , comme exprimé dans la réponse de Mike Abdullah. La définition de vos cellules preservesSuperviewLayoutMargins=NO
garantit que votre vue de table ne remplace pas les paramètres de la cellule. Si vous souhaitez réellement que l'ensemble de votre vue de table ait des marges cohérentes, veuillez ajuster votre code en conséquence.
Configurez vos marges de cellule:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
// Remove seperator inset
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsZero];
}
// Prevent the cell from inheriting the Table View's margin settings
if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
[cell setPreservesSuperviewLayoutMargins:NO];
}
// Explictly set your cell's layout margins
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setLayoutMargins:UIEdgeInsetsZero];
}
}
Swift 4:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
// Remove seperator inset
if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
cell.separatorInset = .zero
}
// Prevent the cell from inheriting the Table View's margin settings
if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
cell.preservesSuperviewLayoutMargins = false
}
// Explictly set your cell's layout margins
if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
cell.layoutMargins = .zero
}
}
La définition de la preservesSuperviewLayoutMargins
propriété NO sur votre cellule devrait empêcher votre vue de table de remplacer vos marges de cellule. Dans certains cas, il semble ne pas fonctionner correctement.
Si tout échoue, vous pouvez forcer brutalement vos marges d'affichage de table:
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
// Force your tableview margins (this may be a bad idea)
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
Swift 4:
func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
// Force your tableview margins (this may be a bad idea)
if tableView.responds(to: #selector(setter: UITableView.separatorInset)) {
tableView.separatorInset = .zero
}
if tableView.responds(to: #selector(setter: UITableView.layoutMargins)) {
tableView.layoutMargins = .zero
}
}
... et c'est parti! Cela devrait fonctionner sur iOS 7 et 8.
EDIT: Mohamed Saleh attiré mon attention sur un éventuel changement dans iOS 9. Vous devrez peut - être régler le Tableau de cellLayoutMarginsFollowReadableWidth
la NO
si vous souhaitez personnaliser ou marges des encarts. Votre kilométrage peut varier, cela n'est pas très bien documenté.
Cette propriété n'existe que dans iOS 9, assurez-vous donc de vérifier avant de définir.
if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}
Swift 4:
if myTableView.responds(to: #selector(setter: self.cellLayoutMarginsFollowReadableWidth)) {
myTableView.cellLayoutMarginsFollowReadableWidth = false
}
(le code ci-dessus à partir du séparateur UITableView iOS 8 ne fonctionne pas )
EDIT: Voici une pure approche Interface Builder:
REMARQUE: iOS 11 modifie et simplifie une grande partie de ce comportement, une mise à jour sera à venir ...