nouveautés - ios 12 sortie




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

Ajoutez simplement ce qui suit à votre viewDidLoad dans votre VC:

self.automaticallyAdjustsScrollViewInsets = NO;

Depuis iOS7, il y a de l'espace supplémentaire en haut de mes UITableView qui ont un style UITableViewStyleGrouped .

Voici un exemple:

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ù provient cette quantité de 35 pixels et comment puis-je m'en débarrasser sans passer à UITableViewStylePlain ?


Beaucoup des réponses précédentes ci-dessus sont trop hacky. Ils se casseraient n'importe quand dans le futur si Apple décidait de réparer ce comportement inattendu.

Racine du problème:

  1. Un UITableView n'aime pas avoir un en-tête avec une hauteur de 0.0. Si ce que vous essayez de faire est d'avoir un en-tête avec une hauteur de 0, vous pouvez passer à la solution.

  2. Même si plus tard vous affectez une hauteur non 0.0 à votre en-tête, UITableView n'aime pas être affecté d'un en-tête d'une hauteur de 0.0 au début.

Solution:

Ensuite, le correctif le plus simple et le plus fiable consiste à s'assurer que la hauteur de votre en-tête n'est pas 0 lorsque vous l'affectez à votre vue de table.

Quelque chose comme ça fonctionnerait:

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;

Quelque chose comme ceci mènerait au problème à un moment donné (typiquement, après un défilement):

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;

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


Dans mon cas c'était ce qui m'a aidé. Je supporte également ios6.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}

Essayez de modifier la propriété UITableView que UITableView hérite de UIScrollView .

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

C'est une solution de contournement, mais cela fonctionne


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

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


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

Parce que mon tableView a une apparence tableHeaderView dynamique, quand j'ai besoin de cacher la tableHeaderView , au 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 définir un contentInset.top quelque peu arbitraire, car contentInset.top dynamiquement le contentInset.top . Avoir à se rappeler d'enlever un 35px supplémentaire chaque fois que je recalcule contentInset.top est fastidieux.


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.

Voir ce projet que j'ai fait en mettant en vedette 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é.


Je pense que faire UIEdgeInsets -35 0 0 0 est fastidieux. Dans mon cas, j'ai implémenté tableView: heightForHeaderInSection: méthode et il a un potentiel pour retourner 0.

Quand j'ai changé 0 à 0.1f, le problème est parti.


Je suppose que cela fait partie du nouveau style UITableViewStyleGrouped . C'est dans toutes les vues groupées et il ne semble pas y avoir de moyen direct de contrôler cet espace.

Si cet espace est représenté par un UIView , il serait possible de rechercher dans toutes les sous- subviews de UITableView pour trouver cette vue spécifique et la modifier directement. Cependant, il y a aussi la possibilité que cet espace soit simplement un décalage codé en dur avant que les en-têtes et les cellules ne commencent et qu'il n'y ait aucun moyen de le modifier.

Pour faire une recherche dans toutes les sous-vues (j'utiliserais ce code quand la table n'a pas de cellules, pour faciliter la lecture de la sortie):

- (void)listSubviewsOfView:(UIView *)view {

    // Get the subviews of the view
    NSArray *subviews = [view subviews];

    // Return if there are no subviews
    if ([subviews count] == 0) return;

    for (UIView *subview in subviews) {

        NSLog(@"%@", subview);

        // List the subviews of subview
        [self listSubviewsOfView:subview];
    }
}

Lors de l'utilisation de TableView groupé, utilisez ceci pour éviter de couper la bordure dans viewWillAppear

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

Ma réponse va être une réponse plus générale, mais peut également s'appliquer à cela.

Si la vue racine (du ViewController ) ou le premier enfant (sous-vue) de la vue racine est sous-classe de UIScrollView (ou UIScrollView lui-même), et si

self.navigationController.navigationBar.translucent = YES;

framework met automatiquement en place le contentInset pré-calculé .

Pour éviter cela, vous pouvez faire

self.automaticallyAdjustsScrollViewInsets = NO;

mais dans mon cas, je n'étais pas capable de le faire, car je mettais en œuvre SDK qui a un composant UIView qui peut être utilisé par d'autres développeurs. Ce composant UIView contient UIWebView (qui a UIScrollView comme première sous-vue). Si ce composant est ajouté en tant que premier enfant dans la hiérarchie de vue de UIViewController, les encarts automatiques seront appliqués par le système.

J'ai corrigé ceci en ajoutant une vue fictive avec frame (0,0,0,0) avant d'ajouter UIWebView.

Dans ce cas, le système n'a pas trouvé la sous-classe UIScrollView comme première sous-vue et n'a pas appliqué les encarts


Nous avons plusieurs réponses pour cela.

1) Vous pouvez ajouter UIImageview à la vue didload

UIImageView * imbBackground = [UIImageView new];
[self.view addSubview:imbBackground];

2) Vous pouvez définir la hauteur de l'en-tête et du pied de page 0.1

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

3) Vous pouvez ajouter une vue d'en-tête et de pied de page avec la hauteur 0.1

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

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)

Swift: iOS J'avais une vue de table sur la vue déroulante .. quand je cliquais sur "Retour" sur le même écran. Faites défiler la vue prendre plus d'espace sur le dessus .. pour résoudre ce que j'ai utilisé:

 self.automaticallyAdjustsScrollViewInsets = false

Valeur booléenne qui indique si le contrôleur de vue doit automatiquement ajuster ses encarts de vue de défilement. La valeur par défaut est true, ce qui permet au contrôleur de vue d'ajuster ses incrustations de vue défilée en réponse aux zones d'écran consommées par la barre d'état, la barre de navigation et la barre d'outils ou la barre d'onglets. Définissez sur false si vous souhaitez gérer vous-même les ajustements d'incrustation de la vue défilante, par exemple lorsqu'il existe plusieurs vues de défilement dans la hiérarchie de vues.


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 .

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 afin qu'il ne soit plus la première sous- vue sur la page.

(Merci à Oded de m'avoir orienté dans cette direction ... Je poste ce commentaire, juste pour ajouter quelques captures d'écran, pour montrer les symptômes et réparer.)


utiliser celui-ci je pense que cette aide ...

 - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
 {
    return 0.005f;// set this according to that you want...
 }

C'est la solution pour iOS 10 utilisant Swift 3:

Vous pouvez vous débarrasser des UITableViewDelegate supérieur et inférieur en implémentant les méthodes suivantes à partir de UITableViewDelegate .

    func tableView( _ tableView: UITableView, heightForHeaderInSection section: Int ) -> CGFloat
    {
       return CGFloat.leastNormalMagnitude
    }

    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
    {
       return CGFloat.leastNormalMagnitude
    }

-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{

    return CGFLOAT_MIN;
}

C'est tout les gens!


override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }






ios7