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.

4voto

Torbjörn Points 21

Même si cela ne résout pas votre problème, cela m'a réussi lorsque j'ai voulu faire une chose similaire. Au lieu de définir l'en-tête, j'ai utilisé le pied de page de la section ci-dessus. Ce qui m'a sauvé, c'est que cette section était petite et statique par nature, et qu'elle n'a donc jamais défilé en dessous du bas de la vue.

4voto

Le moyen le plus simple d'obtenir ce que vous voulez est de définir le style de votre table en tant que UITableViewStyleGrouped , style de séparateur comme UITableViewCellSeparatorStyleNone :

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
    return CGFLOAT_MIN; // return 0.01f; would work same 
}

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    return [[UIView alloc] initWithFrame:CGRectZero];
}

N'essayez pas de renvoyer la vue du pied de page comme nil N'oubliez pas de définir la hauteur et la vue de l'en-tête, après quoi vous obtiendrez ce que vous souhaitez.

3voto

Martin Points 151

Vous pourriez peut-être utiliser scrollViewDidScroll sur le tableView et modifie le contentInset en fonction de l'en-tête visible actuel.

Cela semble fonctionner pour mon cas d'utilisation !

extension ViewController : UIScrollViewDelegate{

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        guard   let tableView = scrollView as? UITableView,
            let visible = tableView.indexPathsForVisibleRows,
            let first = visible.first else {
            return
        }

        let headerHeight = tableView.rectForHeader(inSection: first.section).size.height
        let offset =  max(min(0, -tableView.contentOffset.y), -headerHeight)
        self.tableView.contentInset = UIEdgeInsetsMake(offset, 0, -offset, 0)
   }
}

2voto

James Laurenstin Points 230

En réfléchissant à la manière d'aborder ce problème, je me suis souvenu d'un détail très important concernant UITableViewStyleGrouped. La façon dont UITableView implémente le style groupé (les bordures arrondies autour des cellules) est en ajoutant un backgroundView personnalisé à UITableViewCells, et non à UITableView. Chaque cellule se voit ajouter un backgroundView en fonction de sa position dans la section (les rangées supérieures reçoivent la partie supérieure de la bordure de la section, les rangées centrales reçoivent la bordure latérale et la rangée inférieure reçoit - eh bien, la partie inférieure). Donc, si nous voulons juste un style simple, et que nous n'avons pas de backgroundView personnalisé pour nos cellules (ce qui est le cas dans 90% des cas), alors tout ce que nous devons faire est d'utiliser UITableViewStyleGrouped, et de supprimer le fond personnalisé. Cela peut être fait en suivant ces deux étapes :

Changez le style de notre tableView en UITableViewStyleGrouped. Ajoutez la ligne suivante à cellForRow, juste avant de renvoyer la cellule :

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

Et c'est tout. Le style du tableView deviendra exactement comme UITableViewStylePlain, sauf pour les en-têtes flottants.

J'espère que cela vous aidera !

1voto

Daniel Skinner Points 999

Pour supprimer complètement les sections d'en-tête flottantes, vous pouvez procéder comme suit :

- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    return [[UIView alloc] init];
}

return nil ne fonctionne pas.

Pour désactiver le flottement mais continuer à afficher les en-têtes de section, vous pouvez fournir une vue personnalisée avec ses propres comportements.

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