Question Pourquoi existe-t-il un remplissage supplémentaire en haut de mon UITableView avec le style UITableViewStyleGrouped dans iOS7


À partir de iOS7, il y a de l'espace supplémentaire en haut de mon UITableViewqui ont un style UITableViewStyleGrouped.

Voici un exemple:

enter image description here

La vue de table commence à la première flèche, il y a 35 pixels de remplissage inexpliqués, alors l'en-tête vert est un UIView retourné par viewForHeaderInSection (où la section est 0).

Quelqu'un peut-il expliquer d'où vient cette quantité de 35 pixels et comment je peux m'en débarrasser sans passer à UITableViewStylePlain?


558
2017-09-18 19:07


origine


Réponses:


J'ai été aidé par ce qui suit:

YouStoryboard.storyboard> YouViewController> Inspecteur d'attributs> Décocher - Ajuste les incrustations de vue défilante.

enter image description here


837
2017-10-01 13:36



J'ai joué avec un peu plus et il semble que ce soit un effet secondaire de la mise en tableHeaderView = nil.

Parce que mon tableView a une apparence dynamique tableHeaderView, quand j'ai besoin de cacher le tableHeaderViewau lieu de faire self.tableView.tableHeaderView = nil;, Je fais:

self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];

J'aime mieux cette solution que de mettre un peu arbitraire contentInset.top parce que j'utilise le contentInset.top dynamiquement aussi bien. Avoir à se rappeler d'enlever un 35px supplémentaire chaque fois que je recalculer contentInset.top est fastidieux.


281
2017-09-21 23:33



Pour IOS 7, si vous allouez une vue de table dans un contrôleur de vue, vous pouvez vérifier

self.edgesForExtendedLayout = UIRectEdgeNone;

votre problème semblait similaire au mien

Mettre à jour: 

Swift dans iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Swift 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)

170
2017-09-20 21:16



Essayez de changer le contentInset propriété UITableView hérite de UIScrollView.

self.tableView.contentInset = UIEdgeInsetsMake(-36, 0, 0, 0);

C'est une solution de contournement, mais cela fonctionne


148
2017-09-21 17:32



self.automaticallyAdjustsScrollViewInsets = NO;

essayez, vous pouvez y faire face!


125
2017-10-29 02:32



Vous pouvez détecter si votre application exécute iOS7 ou version ultérieure et ajouter ces deux méthodes dans votre délégué tableau (généralement dans votre code UIViewController)

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN;
}

Ce n'est peut-être pas une solution élégante mais ça marche pour moi


60
2017-10-25 18:26



J'ai trouvé la cause de mon bug original et créé un exemple de projet le présentant. Je crois qu'il y a un bug iOS7.

Depuis iOS7, si vous créez un UITableView avec le style Groupé, mais n'avez pas de délégué sur la première mise en page, alors vous définissez un délégué et appelez reloadData, il y aura un espace de 35px en haut qui ne disparaîtra jamais.

Voyez ce projet que j'ai réalisé en présentant le bug: https://github.com/esilverberg/TableViewDelayedDelegateBug

Plus précisément ce fichier: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m

Si la ligne 24 est active,

[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];

il y aura un espace supplémentaire de 35 px au sommet. Si la ligne 27 est active et 24 est commentée,

self.tableView.delegate = self;

pas d'espace en haut. C'est comme si la tableView mettait en cache un résultat quelque part et ne se redessinait pas après que le délégué soit défini et que reloadData soit appelé.


49
2017-10-05 05:52



Décochez "Ajuster les incrustations de vue défilement"

enter image description here


45
2017-08-26 03:51



Un autre commentaire rapide ... même dans XCode 6.1, il y a un bug avec des espaces verticaux apparaissant en haut de UIScrollViews, UITextViews et UITableViews.

enter image description here

Parfois, la seule façon de résoudre ce problème est d'aller dans le Storyboard et de faire glisser le contrôle de problème pour que ce ne soit plus le premier sous-vue sur la page.

enter image description here

(Mes remerciements à Oded pour me pointer dans cette direction ... Je poste ce commentaire, juste pour ajouter quelques captures d'écran, pour montrer les symptômes et corriger.)


44
2018-01-07 08:14



Selon ce guide de transition pour iOS7 par Apple, les encarts de contenu de la vue déroulante sont automatiquement ajustés. La valeur par défaut de automaticAdjustsScrollViewInsets est défini sur OUI.

Le UIViewController qui a le UITableView devrait définir cette propriété à NO.

self.automaticallyAdjustsScrollViewInsets = NO;

Ça fera l'affaire.

EDIT 1: 

En outre, on pourrait essayer -

self.navigationController.navigationBar.translucent = YES;

Cela supprime également le rembourrage supplémentaire sur le dessus.


37
2018-01-15 12:32