207 votes

Est-il possible de désactiver les en-têtes flottants dans UITableView avec UITableViewStylePlain ?

J'utilise un UITableView pour mettre en page le contenu des "pages". J'utilise les en-têtes de la vue tableau pour mettre en page certaines images, etc. et je préférerais qu'ils ne flottent pas, mais restent statiques, comme c'est le cas lorsque le style est défini comme suit UITableViewStyleGrouped .

Autre que l'utilisation UITableViewStyleGrouped existe-t-il un moyen de le faire ? J'aimerais éviter d'utiliser l'option groupée, car elle ajoute une marge à toutes mes cellules et nécessite la désactivation de l'affichage en arrière-plan pour chacune des cellules. J'aimerais avoir le contrôle total de ma mise en page. L'idéal serait une "UITableViewStyleBareBones", mais je n'ai pas vu cette option dans la documentation...

Merci beaucoup,

1 votes

63 votes

Utiliser le style de table UITableViewStyleGrouped - voici la réponse pour tous ceux qui cherchent à désactiver les en-têtes flottants et ne lisent pas toute la question (cela m'est arrivé...).

0 votes

@Kasztan C'est une solution de ligne zéro qui fonctionne très bien ! Merci.

26voto

frankodwyer Points 9422

Vous devriez pouvoir contourner ce problème en utilisant une cellule personnalisée pour vos lignes d'en-tête. Celles-ci défileront alors comme n'importe quelle autre cellule dans la vue tableau.

Vous devez juste ajouter une certaine logique dans votre cellForRowAtIndexPath pour retourner le type de cellule de droite lorsqu'il s'agit d'une ligne d'en-tête.

Vous devrez probablement gérer vos sections vous-même, c'est-à-dire tout mettre dans une section et truquer les en-têtes. (Vous pourriez aussi essayer de renvoyer une vue cachée pour la vue de l'en-tête, mais je ne sais pas si cela fonctionnera)

12 votes

Ouais... ça semble être un peu un hack. Cela ressemble à un oubli de la part d'Apple, car il est clair que le code est là pour le faire, nous devons juste être en mesure de définir un drapeau.

2 votes

Consultez ma réponse ci-dessous pour connaître la manière correcte d'obtenir cet effet sans avoir à recourir à un hack spécial, il suffit de gérer la première cellule de chaque section comme son en-tête de section !

18voto

Aks Points 369

Changez le style de votre TableView :

self.tableview = [[UITableView alloc] initwithFrame:frame style:UITableViewStyleGrouped];

Conformément à la documentation d'Apple pour UITableView :

UITableViewStylePlain- Une vue de table simple. Tout en-tête ou pied de section de section sont affichés sous forme de séparateurs en ligne et flottent lorsque la vue défilement de la vue tableau.

UITableViewStyleGrouped- Une vue de table dont les sections sont distinctes. groupes de lignes distincts. Les en-têtes et pieds de section ne sont pas flottants.

17voto

adamsiton Points 2003

Ce qui est intéressant avec UITableViewStyleGrouped, c'est que le tableView ajoute le style à l'image de la table. cellules et non au TableView.

Le style est ajouté en tant que backgroundView aux cellules dans une classe appelée UIGroupTableViewCellBackground qui gère le dessin d'un arrière-plan différent selon la position de la cellule dans la section.

Une solution très simple consistera donc à utiliser UITableViewStyleGrouped, à définir la couleur d'arrière-plan du tableau sur clearColor et à remplacer simplement la vue d'arrière-plan de la cellule dans cellForRow :

cell.backgroundView = [[[UIView alloc] initWithFrame:cell.bounds] autorelease];

1 votes

Cela devrait être la première réponse. Il y a un article de blog à ce sujet ici : corecocoa.wordpress.com/2011/09/17/

0 votes

Cette solution ne fonctionne pas vraiment. Je continue à obtenir un espace supplémentaire autour des cellules environnantes. Une idée ?

2 votes

L'affichage du contenu des cellules ne serait-il pas toujours décalé vers la droite ?

6voto

Lane Points 119

Il existe un autre moyen délicat. L'idée principale est de doubler le nombre de sections, et la première montre seulement la vue d'en-tête tandis que la seconde montre les cellules réelles.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return sectionCount * 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (section%2 == 0) {
        return 0;
    }
    return _rowCount;
}

Ce qu'il faut faire alors est d'implémenter les délégués headerInSection :

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerview;
    }
    return nil;
}

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    if (section%2 == 0) {
        //return headerheight;
    }
    return 0;
}

Cette approche a également peu d'impact sur vos sources de données :

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    int real_section = (int)indexPath.section / 2;
    //your code
}

Par rapport à d'autres approches, cette méthode est sûre tout en ne modifiant pas le cadre ou les ContentInsets du tableau. J'espère que cela pourra vous aider.

5voto

Tamás Sengel Points 25414

Pour Swift 3 et plus

Il suffit d'utiliser UITableViewStyleGrouped et définissez la hauteur du pied de page à zéro avec ce qui suit :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X