J'ai trouvé une solution VRAIMENT SIMPLE à cela comme un effet secondaire à un que UITableView
je travaillais .....
Stockez la hauteur des cellules dans une variable qui rapporte normalement la hauteur d'origine via le tableView: heightForRowAtIndexPath:
, puis lorsque vous souhaitez animer un changement de hauteur, changez simplement la valeur de la variable et appelez cela ...
[tableView beginUpdates];
[tableView endUpdates];
Vous constaterez qu'il ne fait pas un rechargement complet mais suffit pour UITableView
savoir qu'il doit redessiner les cellules, en saisissant la nouvelle valeur de hauteur pour la cellule .... et devinez quoi? Il anime le changement pour vous. Doux.
J'ai une explication plus détaillée et des exemples de code complets sur mon blog ... Animer UITableView Cell Height Change
You can also use this method followed by the endUpdates method to animate the change in the row heights without reloading the cell.
developer.apple.com/library/ios/documentation/UIKit/Reference/…J'aime la réponse de Simon Lee. Je n'ai pas réellement essayé cette méthode, mais il semble que cela changerait la taille de toutes les cellules de la liste. J'espérais un changement de la cellule qui est tapée. Je l'ai fait un peu comme Simon mais avec juste une petite différence. Cela changera l'apparence d'une cellule lorsqu'elle sera sélectionnée. Et ça anime. Juste une autre façon de le faire.
Créez un int pour contenir une valeur pour l'index de cellule actuellement sélectionné:
Alors:
Alors:
Je suis sûr que vous pouvez apporter des modifications similaires dans tableView: cellForRowAtIndexPath: pour changer le type de cellule ou même charger un fichier xib pour la cellule.
Comme ceci, le CurrentSelection commencera à 0. Vous auriez besoin de faire des ajustements si vous ne vouliez pas que la première cellule de la liste (à l'index 0) soit sélectionnée par défaut.
la source
Ajouter une propriété pour garder une trace de la cellule sélectionnée
Réglez-le sur une valeur sentinelle dans (par exemple)
viewDidLoad
, pour vous assurer que lesUITableView
départs en position «normale»Dans,
heightForRowAtIndexPath
vous pouvez définir la hauteur souhaitée pour la cellule sélectionnéeDans
didSelectRowAtIndexPath
vous enregistrez la sélection actuelle et enregistrez une hauteur dynamique, si nécessaireDans
didDeselectRowAtIndexPath
remettre l'index de sélection à la valeur sentinelle et animer la cellule à sa forme normalela source
reloadData n'est pas bon car il n'y a pas d'animation ...
Voici ce que j'essaie actuellement:
Cela fonctionne presque bien. Presque. J'augmente la hauteur de la cellule, et parfois il y a un petit "hoquet" dans la vue du tableau lorsque la cellule est remplacée, comme si une position de défilement dans la vue du tableau était préservée, la nouvelle cellule (qui est la première cellule dans le tableau) se retrouve avec son décalage trop élevé et la vue de défilement rebondit pour le repositionner.
la source
Je ne sais pas ce que sont toutes ces choses sur l'appel successif de beginUpdates / endUpdates, vous pouvez simplement utiliser
-[UITableView reloadRowsAtIndexPaths:withAnimation:]
. Voici un exemple de projet .la source
J'ai résolu avec
reloadRowsAtIndexPaths
.didSelectRowAtIndexPath
J'enregistre dans l'indexPath de la cellule sélectionnée et j'appellereloadRowsAtIndexPaths
à la fin (vous pouvez envoyer NSMutableArray pour la liste des éléments que vous souhaitez recharger).Dans,
heightForRowAtIndexPath
vous pouvez vérifier si indexPath est dans la liste ou non des cellules expandIndexPath et envoyer la hauteur.Vous pouvez vérifier cet exemple de base: https://github.com/ferminhg/iOS-Examples/tree/master/iOS-UITableView-Cell-Height-Change/celdascambiadetam C'est une solution simple.
j'ajoute une sorte de code si vous aide
la source
Au lieu de
beginUpdates()
/endUpdates()
, l'appel recommandé est maintenant:Apple dit, concernant beginUpdates / endUpdates: "Utilisez la méthode performBatchUpdates (_: complétement :) au lieu de celle-ci chaque fois que possible."
Voir: https://developer.apple.com/documentation/uikit/uitableview/1614908-beginupdates
la source
Essayez ceci pour développer la ligne d'index:
la source
la source
juste une note pour quelqu'un comme moi qui cherche à ajouter "Plus de détails" sur la cellule personnalisée.
A fait un excellent travail, mais n'oubliez pas de "recadrer" la vue des cellules. Dans Interface Builder, sélectionnez votre cellule -> Affichage du contenu -> dans l'inspecteur des propriétés, sélectionnez " Clip subview "
la source
Voici une version plus courte de la réponse de Simons pour Swift 3. Permet également de basculer la sélection de la cellule
la source
Swift 4 et au-dessus
ajoutez le code ci-dessous dans la méthode de délégué de ligne didselect de votre tableview
la source
Version rapide de la réponse de Simon Lee.
Puis dans didSelectRowAtIndexPath ()
la source
Oui c'est possible.
UITableView
a une méthode déléguéedidSelectRowAtIndexPath
Mais dans votre cas, si l'utilisateur fait défiler et sélectionne une cellule différente, vous devez avoir la dernière cellule sélectionnée pour réduire et développer les
reloadRowsAtIndexPaths:
appels de cellule actuellement sélectionnés,heightForRowAtIndexPath:
alors gérez-les en conséquence.la source
Voici mon code de
UITableView
sous-classe personnalisée , qui se développeUITextView
au niveau de la cellule du tableau, sans rechargement (et perte du focus clavier):la source
J'ai utilisé la réponse impressionnante de @ Joy, et cela a parfaitement fonctionné avec ios 8.4 et XCode 7.1.1.
Dans le cas où vous cherchez à faire basculer votre cellule, j'ai changé le -tableViewDidSelect comme suit:
J'espère que tout cela vous a aidé.
la source
Vérifiez cette méthode après iOS 7 et versions ultérieures.
Des améliorations ont été apportées à cela dans iOS 8. Nous pouvons le définir comme propriété de la vue de table elle-même.
la source
Version rapide de la réponse de Simon Lee :
N'oubliez pas que vous devez modifier les propriétés de hauteur AVANT
endUpdates()
.la source
Contributions -
tableView.beginUpdates () tableView.endUpdates () ces fonctions n'appelleront pas
func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {}
Mais, si vous le faites, tableView.reloadRows (à: [selectedIndexPath! As IndexPath], avec: .none)
Il appellera func tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {} cette fonction.
la source
Je viens de résoudre ce problème avec un petit hack:
Lorsque j'ai besoin d'augmenter la hauteur des cellules, je définis
isInEdit = YES
et appelle la méthode[self onTimer]
et elle anime la croissance des cellules jusqu'à ce qu'elle atteigne la valeur s_CellHeightEditing :-)la source
Récupère le chemin d'index de la ligne sélectionnée. Rechargez la table. Dans la méthode heightForRowAtIndexPath de UITableViewDelegate, définissez la hauteur de la ligne sélectionnée sur une hauteur différente et pour les autres, retournez la hauteur de ligne normale
la source
[table reloadData]
entraîne un changement instantané de la hauteur, plutôt qu'une animation.