web-dev-qa-db-fra.com

Supprimer SeparatorInset sur iOS 8 UITableView pour XCode 6 iPhone Simulator

J'ai trouvé un espace blanc étrange sur UITableView pour iPhone 6 Simulator (iOS 8) sur XCode 6 GM. J'ai essayé de définir la SeparatorInset à partir du storyboard et du code, mais l'espace est vide jusqu'à la fin. 

Le code suivant fonctionne sur iOS 7 mais pas sur iOS 8 (simulateur iPhone 6).

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
    if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
        [tableView setSeparatorInset:UIEdgeInsetsZero];
    }
}

J'ai joint la capture d'écran ci-dessous:

iPhone 6 Simulator weird white space on tableview

J'utilise AutoLayout en passant. J'espère que quelqu'un pourra me montrer un moyen de supprimer l'étrange espace blanc de la TableView.

61
Ricky

Merci aux étudiants de m'avoir dirigé dans la bonne direction avec le commentaire "Essayez ceci self.myTableView.layoutMargins = UIEdgeInsetsZero;" Cette ligne de code ne fonctionnera que sur iOS 8 car layoutMargins est uniquement disponible à partir d'iOS 8. Si j'exécute le même code sur iOS 7, il se bloque.

@property(nonatomic) UIEdgeInsets layoutMargins
Description   The default spacing to use when laying out content in the view.
Availability  iOS (8.0 and later)
Declared In   UIView.h
Reference UIView Class Reference

enter image description here

Vous trouverez ci-dessous la bonne solution pour résoudre cet espace blanc étrange en définissant tableview layoutMargins et cell layoutMargins sur UIEdgeInsetsZero s'il existe (pour iOS 8). Et cela ne plantera pas non plus sur iOS 7. 

-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(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];
   }
}

Voir la capture d'écran ci-dessous:-

enter image description here

117
Ricky

Essayez de créer une catégorie de classe UITableViewCell et ajoutez ce getter

- (UIEdgeInsets)layoutMargins {
    return UIEdgeInsetsZero;
}

dans iOS7, cela ne sera pas appelé car il n'y a pas cette propriété dans le SDK et ne provoquera aucun crash crash

Ça marche pour moi 

49
Will Zhang

Ma solution avec seulement trois lignes de code:

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)row{
    //
    // ... your code ...
    //
    if ([cell respondsToSelector:@selector(preservesSuperviewLayoutMargins)]){
        cell.layoutMargins = UIEdgeInsetsZero;
        cell.preservesSuperviewLayoutMargins = false;
    }
    return cell;
}
23
Guido Lodetti

IOS8 introduit un nouveau concept nommé Configuration des marges de contenu, une nouvelle propriété nommée layoutMargins est également introduite. Pour plus de détails, reportez-vous au document Apple. Le type de layoutMargins est UIEdgeInsets; la valeur par défaut est {8,8,8,8}. Pour supprimer la ligne de séparation de TableView dans IOS8, en plus de définir tableView.seperatorInset = UIEdgeInsetsZero, vous devez également procéder comme suit:

D'abord définir la macro

#define isIOS8SystemVersion (NSFoundationVersionNumber > NSFoundationVersionNumber_iOS_7_1)

Dans la méthode UITableViewDelegate, ajoutez:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
         static NSString *reuseId = @"cellReuseID" ;
         UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseId];
         if(!cell){
             cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseId];     
         if(isIOS8SystemVersion){   
             cell.layoutMargins = UIEdgeInsetsZero;
             cell.preservesSuperviewLayoutMargins =NO ;
         }

    }

Cela permettra de supprimer la ligne de séparation. Vous pouvez également faire comme suit:

    UITableView *tableView = [[UITableView alloc] init];
    if(isIOS8SystemVersion){
         tableView.layoutMargins = UIEdgeInsetsZero ;
    }

et dans la méthode UITableViewDelegate, ajoutez:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     static NSString *reuseId = @"cellReuseID" ;
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseId];
     if(!cell){
         cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:reuseId];     
     if(isIOS8SystemVersion){   
         cell.layoutMargins = UIEdgeInsetsZero;
     }
}
16
monjer

Dans mon cas dans Xcode 6.2, en plus de la réponse de Will Q, je dois accéder à Main.storyboard> sélectionnez l’Inspecteur UITableViewCell> Attributes. Modifiez la liste déroulante Séparateur des encarts par défaut en Encarts personnalisés . Modifiez l’encart gauche de 15 à 0.

enter image description here

12
voratima

Solution de contournement pour iOS 7 et iOS 8

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    cell.separatorInset = UIEdgeInsetsMake(0.0f, cell.frame.size.width, 0.0f, 0.0f); 
}
10
user3894518

Dans iOS8, vous devez définir Inset both on Row et au niveau de la table.

Niveau de ligne dans cellForRowAtIndexPath:

if ([cell respondsToSelector:@selector(preservesSuperviewLayoutMargins)]){
    cell.layoutMargins = UIEdgeInsetsZero;
    cell.preservesSuperviewLayoutMargins = false;
}

Niveau de table dans le viewDidLoad:

[tableReference setSeparatorInset:UIEdgeInsetsZero];

Après cela, c'est une bonne idée de NETTOYER votre projet. À certaines occasions, j'ai remarqué que ces modifications n'étaient pas directement introduites dans l'application exécutable du simulateur.

9
Vincent

pour iOS 8

essayez en définissant cell.layoutMargins = UIEdgeInsetsZero; dans la méthode cellForRowAtIndexPath

5
Yogendra

Si vous souhaitez supprimer la ligne blanche tout en maintenant le séparateur tel quel, définissez simplement cell.backgroundColor sur tableView backgroundColor. Le simple fait de configurer cell.contentView.backgroundColor ne fait pas disparaître le problème. 

3
honcheng

J'ai essayé de nombreuses façons, aucune ne fonctionne, mais celle-ci fonctionne pour moi.

 WORK FOR ME

1
Harshad

Ajoutez simplement ce qui suit:

tableView.separatorStyle = .none
0
J. Doe

Ajoutez des images de démarrage pour iPhone 6 et plus. Avant que les images ne soient ajoutées, le téléphone s'exécute en mode redimensionnement, c'est-à-dire que les anciennes applications sont redimensionnées pour s'adapter aux nouvelles tailles d'écran. Cela peut être à l'origine des lignes . Les nouvelles images sont Retina HD 5.5 (iPhone6Plus) 1242x2208 et Retina HD 4.7 (iPhone6) 750x1334.

0
Hannes Sverrisson

J'ai statique UITableView et je voulais déplacer la marge d'un séparateur de cellules vers le bord gauche.

Merci aux réponses ci-dessus, c'était ma solution

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    // needed to shift the margin a specific cell to the left Edge
    if indexPath.section == 3 && indexPath.row == 0 {
        cell.layoutMargins = UIEdgeInsetsZero
        cell.preservesSuperviewLayoutMargins = false
        cell.separatorInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)
    }
}
0
DogCoffee

Pour que vos séparateurs UITableView soient nuls pour iOS7 et iOS8, au lieu de modifier le code, modifiez le xib pour UITableView en modifiant Affichage-> Mode-> Aspect Remplir. 

0
strohtennis

Voir iOS 8 UITableView séparateur insert 0 ne fonctionne pas

Fondamentalement, vous devez définir le cell.layoutMargin ainsi que le layoutMargin de la tableView. YMMV, mais je devais configurer la vue de table dans layoutSubviews avant que cela ne fonctionne!

0
cdstamper