J'utilise un UITableView
pour mettre en page des «pages» de contenu. J'utilise les en- têtes de la vue de la table pour la mise en page de certaines images , etc. , et je préférerais que si elles ne flottent pas mais est resté statique comme ils le font quand le style est réglé sur UITableViewStyleGrouped
.
Autre que l'utilisation UITableViewStyleGrouped
, y a-t-il un moyen de le faire? Je voudrais éviter d'utiliser grouped car il ajoute une marge vers le bas de toutes mes cellules et nécessite la désactivation de la vue d'arrière-plan pour chacune des cellules. J'aimerais avoir le contrôle total de ma mise en page. Idéalement, ce serait un "UITableViewStyleBareBones", mais je n'ai pas vu cette option dans la documentation ...
Merci beaucoup,
Réponses:
Vous devriez pouvoir simuler cela en utilisant une cellule personnalisée pour faire vos lignes d'en-tête. Ceux-ci défileront ensuite comme n'importe quelle autre cellule de la vue tableau.
Il vous suffit d'ajouter une logique dans votre
cellForRowAtIndexPath
pour renvoyer le bon type de cellule lorsqu'il s'agit d'une ligne d'en-tête.Vous devrez probablement gérer vos sections vous-même, c'est-à-dire avoir tout dans une section et simuler les en-têtes. (Vous pouvez également essayer de renvoyer une vue masquée pour la vue d'en-tête, mais je ne sais pas si cela fonctionnera)
la source
Un moyen probablement plus simple d'y parvenir:
Objectif c:
Rapide:
Les en-têtes de section défileront désormais comme n'importe quelle cellule normale.
la source
(Pour ceux qui sont arrivés ici en raison d'un mauvais style de tableau) Changez le style de tableau de simple à groupé, via l'inspecteur d'attributs ou via le code:
la source
TableView Style
propriété dans AttributesInspector.ATTENTION : cette solution implémente une méthode API réservée. Cela pourrait empêcher l'application d'être approuvée par Apple pour distribution sur l'AppStore.
J'ai décrit les méthodes privées qui transforment les en-têtes de section flottant dans mon blog
En gros, il vous suffit de sous
UITableView
- classer et de retournerNO
dans deux de ses méthodes:la source
Ok, je sais qu'il est tard mais je devais le faire. J'ai passé 10 heures à rechercher une solution fonctionnelle mais je n'ai pas trouvé de réponse complète. J'ai trouvé des indices mais difficile à comprendre pour les débutants. J'ai donc dû mettre mes 2 cents et compléter la réponse.
Comme cela a été suggéré dans quelques-unes des réponses, la seule solution de travail que j'ai pu mettre en œuvre est d'insérer des cellules normales dans la vue de tableau et de les gérer comme des en-têtes de section, mais le meilleur moyen d'y parvenir est d'insérer ces cellules à ligne 0 de chaque section. De cette façon, nous pouvons gérer très facilement ces en-têtes non flottants personnalisés.
Donc, les étapes sont.
Implémentez UITableView avec le style UITableViewStylePlain.
Implémentez titleForHeaderInSection comme d'habitude (vous pouvez obtenir cette valeur en utilisant votre propre logique, mais je préfère utiliser des délégués standard).
Immplement numberOfSectionsInTableView comme d'habitude
Implémentez numberOfRowsInSection comme d'habitude.
Renvoie 0.0f dans heightForHeaderInSection.
N'implémentez PAS viewForHeaderInSection. Supprimez complètement la méthode au lieu de renvoyer nil.
Dans heightForRowAtIndexPath. Vérifiez si (indexpath.row == 0) et renvoyez la hauteur de cellule souhaitée pour l'en-tête de section, sinon renvoyez la hauteur de la cellule.
Maintenant, dans cellForRowAtIndexPath, vérifiez si (indexpath.row == 0) et implémentez la cellule comme vous voulez que l'en-tête de section soit et définissez le style de sélection sur aucun. ELSE implémentez la cellule comme vous le souhaitez.
Maintenant, implémentez willSelectRowAtIndexPath et retournez nil si indexpath.row == 0. Cela garantira que didSelectRowAtIndexPath ne sera jamais déclenché pour la ligne d'en-tête Section.
Et enfin dans didSelectRowAtIndexPath, vérifiez si (indexpath.row! = 0) et continuez.
Avec cela, vous avez terminé. Vous avez maintenant un en-tête de section parfaitement défilant et non flottant.
la source
Dans votre Interface Builder, cliquez sur votre problème Vue de table
Ensuite, accédez à l'inspecteur d'attributs et changez Style simple en groupé;) Facile
la source
La chose intéressante à propos de UITableViewStyleGrouped est que la tableView ajoute le style aux cellules et non au TableView.
Le style est ajouté en tant que backgroundView aux cellules en tant que classe appelée UIGroupTableViewCellBackground qui gère le dessin d'un arrière-plan différent en fonction de la position de la cellule dans la section.
Une solution très simple sera donc d'utiliser UITableViewStyleGrouped, de définir backgroundColor du tableau sur clearColor, et de simplement remplacer le backgroundView de la cellule dans cellForRow:
la source
Changez votre style TableView:
Selon la documentation Apple pour UITableView:
la source
Il existe un autre moyen délicat. L'idée principale est de doubler le numéro de section, et le premier n'affiche que l'en-têteView tandis que le second montre les cellules réelles.
Ce qu'il faut alors faire est d'implémenter les délégués headerInSection:
Cette approche a également peu d'impact sur vos sources de données:
En comparant avec d'autres approches, cette méthode est sûre sans changer le frame ou contentInsets de la tableview. J'espère que cela peut aider.
la source
Le moyen le plus simple d'obtenir ce que vous voulez est de définir votre style de tableau comme
UITableViewStyleGrouped
, style de séparateur commeUITableViewCellSeparatorStyleNone
:N'essayez pas de retourner la vue du pied de page comme
nil
, n'oubliez pas de définir la hauteur de l'en-tête et la vue de l'en-tête, après avoir obtenu ce que vous souhaitez.la source
Bien que cela ne résout pas votre problème, cela a été le cas pour moi lorsque je voulais 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, donc elle ne défilait jamais en dessous du bas de la vue.
la source
Pour Swift 3+
Utilisez simplement
UITableViewStyleGrouped
et réglez la hauteur du pied de page à zéro avec ce qui suit:la source
.leastNormalMagnitude
. Vous devez également mettre en œuvretableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView?
viewForFooterInSection
fonction dans ce cas.0
et a.leastNormalMagnitude
eu le même effet. La mise en œuvre de laviewForFooterSection
méthode est nécessaire. Vous devriez retourner nul. C'est sur Swift 5.1 avec Xcode 11.3.1.En réfléchissant à la manière d'aborder ce problème, je me suis souvenu d'un détail très important sur UITableViewStyleGrouped. La façon dont UITableView implémente le style groupé (les bordures arrondies autour des cellules) consiste à ajouter un backgroundView personnalisé à UITableViewCells, et non à UITableView. Chaque cellule est ajoutée un backgroundView en fonction de sa position dans la section (les lignes supérieures obtiennent la partie supérieure de la bordure de la section, celles du milieu la bordure latérale et celle du bas - enfin, 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 supprimer l'arrière-plan personnalisé . Cela peut être fait en suivant ces deux étapes:
Changez notre style 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 tableView deviendra exactement comme UITableViewStylePlain, sauf pour les en-têtes flottants.
J'espère que cela t'aides!
la source
Peut-être que vous pourriez utiliser
scrollViewDidScroll
sur la tableView et modifier lecontentInset
fonction de l'en-tête visible actuel.Cela semble fonctionner pour mon cas d'utilisation!
la source
Une autre façon de le faire est de créer une section vide juste avant celle sur laquelle vous voulez l'en-tête et de placer votre en-tête sur cette section. Parce que la section est vide, l'en-tête défilera immédiatement.
la source
Vous pouvez ajouter une section (avec zéro ligne) ci-dessus, puis définir la sectionFooterView ci-dessus comme headerView de la section actuelle, footerView ne flotte pas. J'espère que cela donne une aide.
la source
Ignorez XAK. N'explorez aucune méthode privée si vous souhaitez que votre application ait une chance d'être acceptée par Apple.
C'est plus simple si vous utilisez Interface Builder. Vous ajouteriez un UIView en haut de la vue (où les images iront), puis ajouter votre tableview ci-dessous. IB devrait le dimensionner en conséquence; c'est-à-dire que le haut du tableau touche le bas de l'UIView que vous venez d'ajouter et sa hauteur couvre le reste de l'écran.
L'idée ici est que si cet UIView ne fait pas réellement partie de la vue de table, il ne défilera pas avec la vue de table. c'est à dire ignorer l'en-tête tableview.
Si vous n'utilisez pas le générateur d'interface, c'est un peu plus compliqué car vous devez obtenir le positionnement et la hauteur corrects pour la vue de la table.
la source
Vérifiez la réponse comment implémenter les en-têtes avec StoryBoard: Vues des en- têtes de table dans StoryBoards
Notez également que si vous ne mettez pas en œuvre
il ne flottera pas, ce qui est exactement ce que vous voulez.
la source
Pour supprimer complètement les sections d'en-tête de section flottante, vous pouvez le faire:
return nil
ne fonctionne pas.Pour désactiver le flottant tout en affichant les en-têtes de section, vous pouvez fournir une vue personnalisée avec ses propres comportements.
la source
Une variante de la solution de @ samvermette:
la source
L'extrait affiche un en-tête collant uniquement pour la première section. D'autres en-têtes de section flotteront avec des cellules.
la source
Cela peut être réalisé en affectant manuellement la vue d'en-tête dans la méthode viewDidLoad de UITableViewController au lieu d'utiliser les viewForHeaderInSection et heightForHeaderInSection du délégué. Par exemple, dans votre sous-classe de UITableViewController, vous pouvez faire quelque chose comme ceci:
La vue d'en-tête disparaîtra alors lorsque l'utilisateur fera défiler. Je ne sais pas pourquoi cela fonctionne comme ça, mais cela semble réaliser ce que vous cherchez à faire.
la source
Peut-être que vous pouvez simplement rendre l'arrière-plan de la vue d'en-tête transparent:
Ou appliquez-le globalement:
la source
J'ai une autre solution encore plus simple, à utiliser sans mise en page automatique et avec tout ce qui est fait via le XIB:
1 / Mettez votre en-tête dans la vue du tableau par glisser-déposer directement sur la vue du tableau.
2 / Dans l'inspecteur de taille de l'en-tête nouvellement créé, changez simplement son autosizing: vous ne devez laisser que les ancres du haut, gauche et droite, plus le remplissage horizontalement.
Cela devrait faire l'affaire !
la source
Selon la réponse de @ samvermette, j'ai implémenté le code ci-dessus dans Swift pour faciliter l'utilisation de Swift par les codeurs.
la source
réf: https://stackoverflow.com/a/26306212
let tableView = UITableView(frame: .zero, style: .grouped)
PLUSE
Cela a aidé à utiliser l'espace d'en-tête
la source
Dernière mise à jour 2020
Testé avec Xcode 14.
Pour masquer un en-tête de section, renvoyez nil pour le titre du délégué de section
la source
vous pouvez facilement y parvenir en implémentant la méthode viewForHeaderInSection dans la classe de délégué tableview. cette méthode attend un UIView comme objet de retour (qui est votre vue d'en-tête). j'ai fait la même chose dans mon code
la source