J'ai donc un UITableView où les séparateurs n'ont pas toute la largeur. Il se termine comme 10 pixels avant le côté gauche. Je jouais avec ce code dans le viewDidLoad
self.tableView.layoutMargins = UIEdgeInsetsZero;
également dans le storyboard lorsque vous pouvez sélectionner des sélecteurs personnalisés ou par défaut. Désormais, toutes les cellules remplies ne possèdent pas de sélecteurs de largeur complète, mais les cellules vides ont une largeur totale.
Comment puis-je résoudre ce problème?
Merci pour votre aide
Ok j'ai trouvé la réponse. Je ne sais pas pourquoi je ne suis pas tombé sur ce message avant, mais bien sûr, une fois que vous avez posé une question, le bon message apparaît tout à coup devant vous. J'ai eu la réponse de ce post: iOS 8 UITableView séparateur encart 0 ne fonctionne pas
Ajoutez simplement ce code sur votre TableViewController
-(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];
}
}
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) {
[self.tableView setSeparatorInset:UIEdgeInsetsZero];
}
if ([self.tableView respondsToSelector:@selector(setLayoutMargins:)]) {
[self.tableView setLayoutMargins:UIEdgeInsetsZero];
}
}
Cela a fonctionné pour moi sur les appareils iOS 8.4 - 9.0 utilisant Xcode 6.4 et Swift 1.2:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = UITableViewCell()
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsetsZero
cell.layoutMargins = UIEdgeInsetsZero
return cell
}
Swift 3. Mise à jour
cell.preservesSuperviewLayoutMargins = false
cell.separatorInset = UIEdgeInsets.zero
cell.layoutMargins = UIEdgeInsets.zero
pour Swift 3:
override func viewDidLoad() {
super.viewDidLoad()
tableView.separatorInset = .zero
tableView.layoutMargins = .zero
}
J’ai hérité de UITableViewController
et j’ai eu besoin de compléter les paramètres insérés dans willDisplayCell
et de définir également preservesSuperviewLayoutMargins
sur false. Dans Swift, cela ressemble à ceci:
override func tableView(_tableView: UITableView,
willDisplayCell cell: UITableViewCell,
forRowAtIndexPath indexPath: NSIndexPath) {
if cell.respondsToSelector("setSeparatorInset:") {
cell.separatorInset = UIEdgeInsetsZero
}
if cell.respondsToSelector("setLayoutMargins:") {
cell.layoutMargins = UIEdgeInsetsZero
}
if cell.respondsToSelector("setPreservesSuperviewLayoutMargins:") {
cell.preservesSuperviewLayoutMargins = false
}
}
Pour les personnes ayant des problèmes avec l'iPad, vous serez dans un état identique à celui de l'iPhone. Vous pouvez ensuite ajuster le separatorInset selon vos besoins.
tableView.cellLayoutMarginsFollowReadableWidth = false
pour Swift dans iOS 9+
si vous utilisez un personnalisé UITableViewCell
:
override var layoutMargins: UIEdgeInsets {
get { return UIEdgeInsetsZero }
set(newVal) {}
}
alors pour votre tableView
dans viewDidLoad
:
self.tableView?.separatorInset = UIEdgeInsetsZero;
self.tableView?.layoutMargins = UIEdgeInsetsZero;
Testé pour iOS 9.3 & Swift 2.2. Assurez-vous de mettre le code dans willDisplayCell
qui est appelée juste avant d'afficher la cellule et non dans cellForRowAtIndexPath
où vous créez uniquement la cellule.
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
cell.separatorInset = UIEdgeInsetsZero
cell.layoutMargins = UIEdgeInsetsZero
}
Ajoutez override
à la fonction de UITableViewController, comme suit: override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
Utilisez-le dans la méthode cellForRowAtIndexPath
pour configurer les spécifications de séparateur de cellule,
cela fonctionne parfaitement pour iOS9.0 +
cell.separatorInset = UIEdgeInsetsZero;
cell.layoutMargins = UIEdgeInsetsZero;
cell.preservesSuperviewLayoutMargins = NO;
Aucune de ces solutions ne fonctionnait pour moi dans Swift 2.2 et Xcode 7.3.1
S'est avéré être la solution la plus simple de tous. Aucun code requis. Il suffit de changer les valeurs TableViewCell
Layout Margins dans votre inspecteur UITableView
:
Pour Swift 3:
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if cell.responds(to: #selector(setter: UITableViewCell.separatorInset)) {
cell.separatorInset = UIEdgeInsets.zero
}
if cell.responds(to: #selector(setter: UITableViewCell.layoutMargins)) {
cell.layoutMargins = UIEdgeInsets.zero
}
if cell.responds(to: #selector(setter: UITableViewCell.preservesSuperviewLayoutMargins)) {
cell.preservesSuperviewLayoutMargins = false
}
}
Aucune de ces solutions ne fonctionne sur l'iPad, mais j'ai mis au point une solution couvrant les deux appareils:
avec cellules réutilisables:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
...[other code]...
[cell setLayoutMargins:UIEdgeInsetsZero];
[cell setSeparatorInset:UIEdgeInsetsZero];
return cell;
}
avec cellules non réutilisables:
- (void)removeSeparatorInset:(UITableView*)tableView{
NSArray *cells = [tableView visibleCells];
for (UITableViewCell *cell in cells){
[cell setLayoutMargins:UIEdgeInsetsZero];
[cell setSeparatorInset:UIEdgeInsetsZero];
}
}
-(void) viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
[self removeSeparatorInset:self.tableView];
}
Juste pour développer cette approche:
@property(nonatomic) UIEdgeInsets separatorInset;
@property(nonatomic) UIEdgeInsets layoutMargins;
Les deux propriétés peuvent être utilisées par UITableView
& UITableViewCell
. Ce dernier est en fait une propriété de UIView
, qui est une classe parente de UITableView
& UITableViewCell
.
Dans viewDidLoad
(testé iOS11 - Swift 4.1)
essayer
tableView.separatorInset = UIEdgeInsetsMake(0, 0, 0, 0)