Est-il possible de désactiver les en-têtes flottantes dans UITableView avec UITableViewStylePlain?
Je suis en utilisant un UITableView
à disposition de contenu "pages". Je suis en utilisant les en-têtes de la vue de la table à la disposition de certaines images, etc. et je préfère le il si elles ne flottent pas mais qui est resté statique comme ils le font quand le style est défini à UITableViewStyleGrouped
.
Puis d'autres à l'aide de UITableViewStyleGrouped
, est-il un moyen de faire cela? J'aimerais éviter d'utiliser regroupés car il ajoute une marge en baisse de toutes mes cellules et nécessite la désactivation de l'arrière-plan de la vue de chacune des cellules. J'aimerais le plein contrôle de ma mise en page. Idéalement, il serait une "UITableViewStyleBareBones", mais je n'ai pas vu cette option dans les docs...
Merci beaucoup,
- stackoverflow.com/questions/664781/...
- Utilisez le tableau de style UITableViewStyleGrouped - c'est la réponse pour tous ceux qui sont à la recherche pour la désactivation flottant en-têtes et ne lisent pas l'ensemble de la question (ça m'est arrivé...).
- C'est un zéro de la ligne de solution qui fonctionne très bien! Merci.
Vous devez vous connecter pour publier un commentaire.
Vous devriez être en mesure de simuler cet effet en utilisant une cellule personnalisé pour faire vos lignes d'en-tête. Ils seront alors faites défiler comme n'importe quelle autre cellule dans le tableau.
Vous avez juste besoin d'ajouter un peu de logique dans votre
cellForRowAtIndexPath
pour retourner le bon type de cellule lorsque c'est une ligne d'en-tête.Vous aurez probablement à gérer vos articles de même, c'est à dire tout dans une section et le faux en-têtes. (Vous pouvez aussi essayer de retourner un caché à la vue pour la vue d'en-tête, mais je ne sais pas si cela va fonctionner)
Probablement un moyen plus simple d'y parvenir:
Objective-C:
Swift:
En-têtes de Section défile désormais comme toute cellule ordinaire.
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 24)];
et de définir le contenu de l'eisn--top à -24 IB. Comment vous faites Glisser une UIView sur votre TableView faire son en-tête de la vue." au bureau de l'IB? Il n'y a pas de point de vente pour latableHeaderView
de la propriété.(Pour qui sont arrivés ici en raison de style de tableau) Changement de style de Tableau à partir d'une plaine regroupés, via les attributs de l'inspecteur, ou via le code:
TableView Style
propriété dans le AttributesInspector ainsi.AVERTISSEMENT: cette solution met en oeuvre un réservé méthode de l'API. Cela pourrait empêcher l'application d'être approuvé par Apple pour la distribution sur l'AppStore.
J'ai décrit les méthodes privées qui transforme des en-têtes de section flottant dans mon blog
Fondamentalement, vous avez juste besoin de la sous-classe
UITableView
et retourNO
dans deux de ses méthodes:@objc
inférence propriété désactivée. Donc, vous devriez à l'occasion de ces méthodes comme@objc
manuellement sinon elle conduira à un comportement indéfini. L'espoir, cette astuce peut vous aider.Ok, je sais que c'est tard, mais je devais le faire.
J'ai passé 10 heures en maintenant à la recherche d'une solution de travail, mais n'a pas trouvé une réponse complète. N'a trouvé quelques indices mais difficile pour un débutant de comprendre. Si je devais mettre dans mes 2 cents et complète la réponse.
Comme il a été suggéré dans le peu de réponses, la seule solution que j'ai été en mesure de mettre en œuvre est d'insérer les cellules normales dans la vue de la table et de les gérer comme en-Têtes de Section, mais la meilleure façon d'y parvenir est par l'insertion de ces cellules dans la ligne 0 de chaque section. De cette façon, nous pouvons nous occuper de ces personnalisé non-flottants en-têtes très facilement.
Donc, les étapes sont.
Mettre en œuvre UITableView avec style UITableViewStylePlain.
Mettre en œuvre titleForHeaderInSection comme d'habitude ( vous pouvez obtenir cette valeur en utilisant votre propre logique, mais je préfère utiliser la norme délégués ).
Immplement numberOfSectionsInTableView comme d'habitude
Mettre en œuvre numberOfRowsInSection comme d'habitude.
Retour 0.0 f dans heightForHeaderInSection.
NE PAS mettre en œuvre viewForHeaderInSection. Supprimer la méthode complètement au lieu de retourner néant.
Dans heightForRowAtIndexPath. Vérifiez si(indexpath.ligne == 0) et le retour de la cellule souhaitée de la hauteur de l'en-tête de section, sinon renvoie la hauteur de la cellule.
Maintenant dans cellForRowAtIndexPath, vérifiez si(indexpath.ligne == 0) et de mettre en œuvre la cellule que vous voulez l'en-tête de section d'être et de définir le style de sélection pour aucun. D'AUTRE mettre en œuvre la cellule que vous voulez que les cellules normales de l'être.
Maintenant mettre en œuvre willSelectRowAtIndexPath et retourner nil si indexpath.ligne == 0. Cela prendra soin que didSelectRowAtIndexPath n'obtient jamais tiré de la Section de la ligne d'en-tête.
Et enfin dans didSelectRowAtIndexPath, vérifiez si(indexpath.la ligne != 0) et passez.
Avec ce que vous avez terminé. Vous avez maintenant une parfaitement le défilement, la non-flottants en-tête de section.
Dans votre Interface Builder, cliquez sur votre Table de problème Vue
Ensuite accéder aux Attributs de l'Inspecteur et de changer de Style de la Plaine à Groupés
😉 Facile
La chose intéressante à propos de UITableViewStyleGrouped est que la tableView ajoute le style à la cellules et de ne pas le TableView.
Le style est ajouté comme backgroundView aux cellules comme une classe appelée UIGroupTableViewCellBackground qui gère le dessin de fond différente selon la position de la cellule dans la section.
Donc une solution très simple est d'utiliser UITableViewStyleGrouped, définir la backgroundColor de la table à clearColor, et il suffit de remplacer le backgroundView de la cellule dans cellForRow:
Changer votre TableView Style:
Conformément à la documentation d'apple pour UITableView:
Il y a une autre façon délicate. L'idée principale est de doubler le numéro de la section, et la première ne montre que les headerView tandis que la seconde montre le véritable cellules.
Ce besoin de faire est alors de mettre en œuvre les headerInSection délégués:
Cette approche a également peu d'impact sur votre source de données:
La comparaison avec d'autres approches, de cette façon est bien sûr tout en ne changeant pas le cadre ou contentInsets de la tableview.
Espérant que cela puisse aider.
La façon la plus simple d'obtenir ce que vous voulez est de définir votre style de tableau que
UITableViewStyleGrouped
,séparateur de style
UITableViewCellSeparatorStyleNone
:N'essayez pas de retour de pied de vue que
nil
, n'oubliez pas de définir l'en-tête de la hauteur et la vue d'en-tête, après vous devez obtenir ce que vous désirez.Même si cela peut ne pas résoudre votre problème, il l'a fait pour moi quand j'ai voulu faire quelque chose de 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é a été que cette section était de petite taille et statique dans la nature, donc il n'a jamais défile en dessous du bas de l'affichage.
En pensant à la manière d'aborder ce problème, je me suis souvenu d'un détail très important sur UITableViewStyleGrouped.
La façon UITableView met en œuvre le groupe de style (les bords arrondis autour des cellules) est par l'ajout d'une coutume backgroundView à la UITableViewCells, et de ne pas la UITableView. Chaque cellule est ajoutée une backgroundView en fonction de sa position dans la section (rangées supérieures obtenir la partie supérieure de la section de la frontière, le moyen de passer du côté de la frontière et, en bas, on obtient – eh bien, la partie inférieure).
Donc, si on veut juste un style ordinaire, et nous n'avons pas coutume backgroundView pour nos cellules (ce qui est le cas dans 90% du temps), alors tout ce que nous devons faire est d'utiliser UITableViewStyleGrouped, et de supprimer l'arrière-plan personnalisé. Cela peut être fait par la suite de ces deux étapes:
Changer notre tableView style de UITableViewStyleGrouped
Ajoutez la ligne suivante à cellForRow, juste avant de nous retourner la cellule:
cellule.backgroundView=[[[UIView alloc] initWithFrame:de la cellule.limites] autorelease];
Et c'est tout. La tableView style de devenir exactement comme UITableViewStylePlain, sauf pour les en-têtes flottantes.
Espérons que cette aide!
Pour Swift 3+
Simplement utiliser
UITableViewStyleGrouped
et définir le pied de la hauteur à zéro avec les éléments suivants:Une autre façon de le faire est de faire une section vide juste avant celui que vous voulez l'en-tête et de mettre votre tête sur l'article. Parce que la section est vide, la tête de défilement immédiatement.
Vous pouvez ajouter une Section(avec des lignes nulles) ci-dessus, puis définir le ci-dessus sectionFooterView que le courant de la section headerView, footerView ne flotte pas.
Espérons qu'il donne une aide.
Peut-être que vous pourriez utiliser
scrollViewDidScroll
sur la tableViewet changer le
contentInset
basé sur l'actuel visible d'en-tête.Cela semble fonctionner pour mon cas d'utilisation!
Ignorer XAK. Ne pas explorer toutes les méthodes privées si vous voulez que votre application pour avoir la chance d'être acceptée par apple.
C'est plus facile si vous êtes en utilisant l'Interface Builder. Vous ajoutez une UIView en haut de la vue (où les images aller), puis d'ajouter votre tableview ci-dessous. IB la taille de celle-ci en conséquence; c'est, du haut de la tableview touche le fond de la UIView vous venez d'ajouter et c'est la hauteur couvre le reste de l'écran.
La pensée est ici que, si cette UIView n'est pas réellement partie de la vue de la table, il ne sera pas défiler avec le tableview. c'est à dire ignorer la tableview en-tête.
Si vous n'êtes pas en utilisant l'interface builder, c'est un peu plus compliqué parce que vous avez pour obtenir le positionnement et la hauteur correcte pour la tableview.
Vérifier la réponse la façon de mettre en œuvre les en-têtes de story-board: Table d'en-Tête de Vues dans les StoryBoards
Notez également que si vous ne mettez pas en œuvre
il ne sera pas le flotteur qui est exactement ce que vous voulez.
Pour supprimer la partie flottante de l'en-tête des sections complètement, vous pouvez le faire:
return nil
ne fonctionne pas.Pour désactiver variable mais toujours afficher les en-têtes de section, vous pouvez fournir une vue personnalisée avec ses propres comportements.
Ceci peut être réalisé par l'affectation de la vue d'en-tête à la main dans le UITableViewController de la méthode viewDidLoad au lieu d'utiliser le délégué du viewForHeaderInSection et heightForHeaderInSection. Par exemple, dans votre sous-classe de UITableViewController, vous pouvez faire quelque chose comme ceci:
L'en-tête de la vue puis disparaissent lorsque l'utilisateur fait défiler. Je ne sais pas pourquoi cela fonctionne comme cela, mais il semble que pour atteindre ce que vous cherchez à faire.
Peut-être vous pouvez simplement faire vue d'en-tête arrière-plan transparent:
Ou de l'appliquer à l'échelle mondiale:
Selon @samvermette réponse,j'ai mis en place le code ci-dessus dans Swift pour le rendre facile pour les programmeurs à utiliser swift.
J'ai une autre solution, plus simple, pour être utilisé sans mise en page automatique et tout ce fait par le biais de la XIB :
1/Mettez votre tête dans la tableview par glisser et en le déposant directement sur la tableview.
2/Dans la Taille de l'Inspecteur de la nouvelle en-tête, il suffit de changer son redimensionnement automatique : vous ne devez laisser le haut, à gauche et à droite ancres, plus le remplissage horizontalement.
Qui devrait faire l'affaire !
ref: https://stackoverflow.com/a/26306212
let tableView = UITableView(frame: .zero, style: .grouped)
PLUSE
Cela a permis d'utiliser l'en-tête de l'espace
vous pouvez facilement atteindre cet objectif par la mise en œuvre de la viewForHeaderInSection à la méthode tableview délégué de classe. cette méthode attend un UIView que le retour de l'objet (qui est de votre en-tête de la vue). j'ai fait la même chose dans mon code