Quelqu'un pourrait -il me dire la façon d'effectuer des UITableView
animations extensibles / rétractables dans sections
des UITableView
comme ci - dessous?
ou
ios
iphone
uitableview
object
vinnitu
la source
la source
Réponses:
Vous devez créer votre propre ligne d'en-tête personnalisée et la placer comme première ligne de chaque section. Sous-classer le
UITableView
ou les en-têtes qui sont déjà là sera une douleur. Compte tenu de la façon dont ils fonctionnent actuellement, je ne suis pas sûr que vous puissiez facilement en tirer des actions. Vous pouvez configurer une cellule pour qu'elle ressemble à un en-tête et configurer letableView:didSelectRowAtIndexPath
pour développer ou réduire manuellement la section dans laquelle elle se trouve.Je stockerais un tableau de booléens correspondant à la valeur «dépensée» de chacune de vos sections. Ensuite, vous pouvez faire
tableView:didSelectRowAtIndexPath
basculer cette valeur sur chacune de vos lignes d'en-tête personnalisées, puis recharger cette section spécifique.Ensuite, définissez
numberOfRowsInSection
pour vérifier lamybooleans
valeur et renvoyer 1 si la section n'est pas développée, ou 1+ le nombre d'éléments dans la section si elle est développée.En outre, vous devrez mettre à jour
cellForRowAtIndexPath
pour renvoyer une cellule d'en-tête personnalisée pour la première ligne de n'importe quelle section.la source
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
est le meilleur moyen de fournir votre "propre en-tête personnalisé", car c'est exactement ce pour quoi il est conçu.Un exemple de code pour animer une action de développement / réduction à l'aide d'un en-tête de section de vue tableau est fourni par Apple ici: Animations et gestes de vue tableau
La clé de cette approche est d'implémenter
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
et de renvoyer un UIView personnalisé qui comprend un bouton (généralement de la même taille que la vue d'en-tête elle-même). En sous-classant UIView et en l'utilisant pour la vue d'en-tête (comme le fait cet exemple), vous pouvez facilement stocker des données supplémentaires telles que le numéro de section.la source
dequeueReusableHeaderFooterViewWithIdentifier
) - cliquez sur cette flèche et faites défiler jusqu'à la première lecture et essayez de la fermer -> NSInternalInconsistencyException (iOS 8.4 / iPhone 5s)J'ai eu une belle solution inspirée des animations et gestes de la vue tableau d'Apple . J'ai supprimé les parties inutiles de l'exemple d'Apple et je l'ai traduit en swift.
Je sais que la réponse est assez longue, mais tout le code est nécessaire. Heureusement, vous pouvez simplement copier et coller la plupart du code et il vous suffit de modifier un peu les étapes 1 et 3
1. créer
SectionHeaderView.swift
etSectionHeaderView.xib
la
SectionHeaderView.xib
(la vue avec un arrière-plan gris) devrait ressembler à ceci dans une vue de table (vous pouvez la personnaliser selon vos besoins, bien sûr):Remarque:
a) l'
toggleOpen
action doit être liée àdisclosureButton
b) l' action
disclosureButton
ettoggleOpen
ne sont pas nécessaires. Vous pouvez supprimer ces 2 éléments si vous n'avez pas besoin du bouton.2. créer
SectionInfo.swift
3. dans votre tableview
la source
Pour implémenter la section de table pliable dans iOS, la magie est de savoir comment contrôler le nombre de lignes pour chaque section, ou nous pouvons gérer la hauteur des lignes pour chaque section.
En outre, nous devons personnaliser l'en-tête de la section afin que nous puissions écouter l'événement tap depuis la zone d'en-tête (qu'il s'agisse d'un bouton ou de l'en-tête entier).
Comment gérer l'en-tête? C'est très simple, nous étendons la classe UITableViewCell et créons une cellule d'en-tête personnalisée comme ceci:
puis utilisez viewForHeaderInSection pour raccorder la cellule d'en-tête:
rappelez-vous que nous devons renvoyer le contentView car cette fonction s'attend à ce qu'un UIView soit renvoyé.
Traitons maintenant de la partie pliable, voici la fonction de bascule qui permet de basculer l'accessoire pliable de chaque section:
dépend de la façon dont vous gérez les données de section, dans ce cas, j'ai les données de section quelque chose comme ceci:
enfin, ce que nous devons faire est basé sur l'accessoire pliable de chaque section, contrôler le nombre de lignes de cette section:
J'ai une démo entièrement fonctionnelle sur mon Github: https://github.com/jeantimex/ios-swift-collapsible-table-section
Si vous souhaitez implémenter les sections réductibles dans une table de style groupé, j'ai une autre démo avec le code source ici: https://github.com/jeantimex/ios-swift-collapsible-table-section-in-grouped-section
J'espère que cela pourra aider.
la source
J'ai une meilleure solution que vous devriez ajouter un UIButton dans l'en-tête de section et définir la taille de ce bouton égale à la taille de la section, mais faites-le masquer par une couleur d'arrière-plan claire, après cela vous pourrez facilement vérifier quelle section sur laquelle vous avez cliqué pour développer ou réduire
la source
tableView:numberOfRowsInSection:
restera intacte et vous pourrez continuer à l'utiliser pour ce qu'elle signifie vraiment. Il en va de mêmetableView:cellForRowAtIndexPath:
.UITableViewHeaderFooterView
et ajoute unesection
propriété et définit aSectionHeaderViewDelegate
qui fournit le rappel pour ouvrir / fermer la section. ( developer.apple.com/library/ios/samplecode/TableViewUpdates/… )J'ai fini par créer juste un headerView qui contenait un bouton (j'ai vu la solution de Son Nguyen ci-dessus après coup, mais voici mon code ... ça ressemble beaucoup mais c'est assez simple):
déclarer quelques booléens pour vos sections
...code
maintenant dans vos méthodes de délégué tableview ...
et enfin la fonction qui est appelée lorsque vous touchez l'un des boutons d'en-tête de section:
la source
[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationFade];
dans la méthode collapse / uncollapse, cela devrait bien s'animer.C'est le meilleur moyen que j'ai trouvé pour créer des cellules de vue de tableau extensibles
fichier .h
fichier .m
Méthodes de délégation de vue de table
la source
Donc, sur la base de la solution `` bouton dans l'en-tête '', voici une implémentation propre et minimaliste:
Voici le code:
la source
J'ai trouvé un autre moyen relativement simple de résoudre ce problème. En utilisant cette méthode, nous ne serons pas obligés de modifier notre cellule qui est presque toujours liée à l'index du tableau de données, ce qui pourrait causer des dégâts dans notre contrôleur de vue.
Tout d'abord, nous ajoutons les propriétés suivantes à notre classe de contrôleur:
collapsedSections
enregistrera les numéros de section réduits.sectionViews
stockera notre vue en coupe personnalisée.Synthétisez-le:
Initialisez-le:
Après cela, nous devons connecter notre UITableView afin qu'il soit accessible à partir de notre classe de contrôleur de vue:
Connectez-le à partir de XIB pour afficher le contrôleur en utilisant
ctrl + drag
comme d'habitude.Ensuite, nous créons une vue en tant qu'en-tête de section personnalisé pour notre vue de table en implémentant ce délégué UITableView:
Ensuite, nous implémentons une méthode pour enregistrer notre en-tête de section personnalisé précédemment créé dans la propriété de classe:
Ajoutez
UIGestureRecognizerDelegate
à notre fichier .h du contrôleur de vue:Ensuite, nous créons une méthode
attachTapGestureToView:
La méthode ci-dessus ajoutera un outil de reconnaissance de gestes de pression à toutes les vues en coupe que nous avons créées auparavant. Ensuite, nous devrions implémenter le
onTap:
sélecteurLa méthode ci-dessus sera invoquée lorsque l'utilisateur tapera sur l'une de nos sections de vue de table. Cette méthode recherche le numéro de section correct en fonction de notre
sectionViews
tableau que nous avons créé auparavant.De plus, nous implémentons une méthode pour obtenir à quelle section de la vue d'en-tête appartient.
Ensuite, nous devons implémenter la méthode
toggleCollapseSection:
Cette méthode insérera / supprimera le numéro de section dans notre
collapsedSections
tableau que nous avons créé auparavant. Lorsqu'un numéro de section est inséré dans ce tableau, cela signifie que la section doit être réduite et développée dans le cas contraire.Ensuite, nous implémentons
removeCollapsedSection:
,addCollapsedSection:section
etisCollapsedSection:section
Ces trois méthodes ne sont que des aides pour nous faciliter l'accès au
collapsedSections
tableau.Enfin, implémentez ce délégué de vue de table pour que nos vues en coupe personnalisées soient belles.
J'espère que ça aide.
la source
J'ai utilisé un NSDictionary comme source de données, cela ressemble à beaucoup de code, mais c'est vraiment simple et fonctionne très bien! à quoi ressemble ici
J'ai créé une énumération pour les sections
propriété sections:
Une méthode renvoyant mes sections:
Et puis configurez mes données soruce:
Les méthodes suivantes vous aideront à savoir quand une section est ouverte et comment répondre à la source de données tableview:
Répondez à la section à la source de données:
Outils:
Basculer la visibilité de la section
la source
// vKj
la source
// vKj
la source
En développant cette réponse écrite en Objectif C, j'ai écrit ce qui suit pour ceux qui écrivent en Swift
L'idée est d'utiliser des sections dans le tableau et de définir le nombre de lignes de la section sur 1 (réduit) et 3 (développé) lorsque la première ligne de cette section est appuyée
Le tableau décide du nombre de lignes à dessiner en fonction d'un tableau de valeurs booléennes
Vous devrez créer deux lignes dans le storyboard et leur donner les identifiants de réutilisation 'CollapsingRow' et 'GroupHeading'
la source
Un exemple de code pour animer une action de développement / réduction à l'aide d'un en-tête de section de vue tableau est fourni par Apple dans les animations et gestes de la vue tableau .
La clé de cette approche est de mettre en œuvre
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
et renvoyer un UIView personnalisé qui comprend un bouton (généralement de la même taille que la vue d'en-tête elle-même). En sous-classant UIView et en l'utilisant pour la vue d'en-tête (comme le fait cet exemple), vous pouvez facilement stocker des données supplémentaires telles que le numéro de section.
la source
J'ai fait la même chose en utilisant plusieurs sections.
la source
J'ajoute cette solution pour être complète et pour montrer comment travailler avec les en-têtes de section.
Lien vers l'essentiel: https://gist.github.com/pawelkijowskizimperium/fe1e8511a7932a0d40486a2669316d2c
la source
pour prendre en charge la solution @ jean.timex, utilisez le code ci-dessous si vous souhaitez ouvrir une section à tout moment. créez une variable comme: var extendedSection = -1;
la source