web-dev-qa-db-fra.com

séparateurs iOS 9 UITableView insets (marge gauche importante)

J'ai un problème avec les séparateurs entre UITableViewCells dans UITableView sur iOS 9. Ils ont la marge gauche importante. J'ai déjà du code pour supprimer l'espacement introduit par iOS 8 mais cela ne fonctionne pas avec iOS 9. On dirait qu'ils ont ajouté quelque chose d'autre. Je suppose que cela pourrait être lié à layoutMarginsGuide mais je ne l'ai pas encore compris. Est-ce que quelqu'un a eu un problème similaire et a trouvé la solution?

47
Julian Król

Ok, j'ai trouvé la solution . La seule chose nécessaire pour cela est de définir sur l'instance de présentation de UITableView cet indicateur cellLayoutMarginsFollowReadableWidth

myTableView.cellLayoutMarginsFollowReadableWidth = NO;

Je voulais trouver une référence dans la documentation, mais il semble que ce n’est pas encore prêt, seulement mentionné sur la page diff .

Comme l'indicateur de compatibilité avec les versions antérieures a été introduit dans iOS 9, vous devez ajouter un contrôle avant d'essayer de le définir:

if([myTableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)])
{
    myTableView.cellLayoutMarginsFollowReadableWidth = NO;
}

Pour Swift 2.0, vous pouvez utiliser #available pour vérifier la version iOS.

if #available(iOS 9, *) {
    myTableView.cellLayoutMarginsFollowReadableWidth = false
}

De plus, vous devez le compiler avec Xcode 7 ou plus.

MODIFIER 

N'oubliez pas qu'il s'agit du seul correctif requis si vos séparateurs ont l'air "correct" jusqu'à iOS 8, sinon vous devez modifier un peu plus. Vous pouvez trouver des informations sur la façon de le faire déjà sur SO.

67
Julian Król

Si vous voulez le faire dans le constructeur d'interface. Le séparateur par défaut est Automatic. Changez-le en custom en sélectionnant le menu déroulant.

 enter image description here

26
ArunGJ

Swift 2.2 iOS 9.3

Dans viewDidLoad

tableView.cellLayoutMarginsFollowReadableWidth = false

Dans UITableViewDelegates

func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    if cell.respondsToSelector(Selector("setSeparatorInset:")){
        cell.separatorInset = UIEdgeInsetsZero
    }
    if cell.respondsToSelector(Selector("setPreservesSuperviewLayoutMargins:")) {
        cell.preservesSuperviewLayoutMargins = false
    }
    if cell.respondsToSelector(Selector("setLayoutMargins:")){
        cell.layoutMargins = UIEdgeInsetsZero
    }
}
16
H.Yuu

Swift 3.0/4.0

tableView.cellLayoutMarginsFollowReadableWidth = false

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: UIView.preservesSuperviewLayoutMargins)) {
        cell.preservesSuperviewLayoutMargins = false
    }
    if cell.responds(to: #selector(setter: UIView.layoutMargins)) {
        cell.layoutMargins = UIEdgeInsets.zero
    }
}
11
derdida

Solution parfaite jusqu'à iOS 9

In viewDidLoad

- (void)viewDidLoad {
    [super viewDidLoad];
    //Required for iOS 9
    if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 9.0) {
        self.testTableView.cellLayoutMarginsFollowReadableWidth = NO;
    }
}

Dans les méthodes TableViewDelegate, ajoutez le code suivant:

- (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];
    }
}
11
Bhuvan Bhatt

Sur la base de différentes réponses ici, je suis en mesure de supprimer le vide du séparateur avec ces lignes de codes dans Swift:

tableView.separatorInset = UIEdgeInsetsZero
tableView.layoutMargins = UIEdgeInsetsZero
cell.separatorInset = UIEdgeInsetsZero
cell.layoutMargins = UIEdgeInsetsZero

Mais j'ai toujours ce petit écart avant le texte:

 enter image description here

5
codelearner

Cela fonctionnait parfaitement pour moi sous iOS 9.

Pour OBJ-C

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(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];
        }
         return cell;
    }
4
jithin

La réponse acceptée n'a pas fonctionné pour moi. Jusqu'à ce que je déplace setCellLayoutMarginsFollowReadableWidth AVANT setLayoutMargins (toujours nécessaire pour iOS 8):

if([_tableView respondsToSelector:@selector(setCellLayoutMarginsFollowReadableWidth:)]) {
  _tableView.cellLayoutMarginsFollowReadableWidth = NO;
}

if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
  _tableView.layoutMargins = UIEdgeInsetsZero;
}
2
Donnit

Pour iOS 8 et 9

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if ([UITableView instancesRespondToSelector:@selector(setLayoutMargins:)]) [[UITableViewCell appearance] setLayoutMargins:UIEdgeInsetsZero];
    if ([UITableView instancesRespondToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) [[UITableViewCell appearance] setPreservesSuperviewLayoutMargins:NO];
}

et

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([cell respondsToSelector:@selector(setLayoutMargins:)]) [cell setLayoutMargins:UIEdgeInsetsZero];
}
1
Javier Sánchez
- (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];
    }

}
1
Mihawk

Ceci est ma solution pour Swift 3.0/iOS 10 dans XCode 8.2.1.

J'ai créé une sous-classe pour UITableview qui fonctionne pour IB et crée par programme des vues de table.

import UIKit

class EXCSuperTV: UITableView
{
    required init?(coder aDecoder: NSCoder)
    {
        super.init(coder: aDecoder)
        setupView()
    }

    override init(frame: CGRect, style: UITableViewStyle)
    {
        super.init(frame: frame, style: style)
        setupView()
    }

    func setupView() {}
}

class EXCNoFooter: EXCSuperTV
{
    override func setupView()
    {
        super.setupView()
        //tableFooterView = UIView.Zero()
    }
}


class EXCMainTV: EXCNoFooter
{
    override func setupView()
    {
        super.setupView()
        separatorInset = UIEdgeInsets.zero
    }
}
0
Darkwonder