Comment animer UITableViewCell hauteur à l'aide d'auto-mise en page?
Il y a beaucoup de questions similaires sur un Débordement de Pile sur UITableViewCell
hauteur de l'animation, mais rien ne fonctionne pour de nouvelles iOS8 mise en page automatique piloté par la vue de la table. Ma question:
De cellule personnalisé:
@property (weak, nonatomic) IBOutlet iCarousel *carouselView;
@property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
@property (weak, nonatomic) IBOutlet UIButton *seeAllButton;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *carouselHeightConstraint;
Note carouselHeightConstraint
. C'est la hauteur de la contrainte pour l'affichage du contenu de la sous-vue (la seule sous-vue).
Hauteur est définie à 230.0f
par exemple. Lors du premier chargement, il ressemble:
Puis, sur Voir Tous les action que je veux développez cellule, mon code:
- (IBAction)seeAllButtonAction:(id)sender {
BOOL vertical = !self.carouselCell.carouselView.vertical;
self.carouselCell.carouselView.type = vertical ? iCarouselTypeCylinder : iCarouselTypeLinear;
self.carouselCell.carouselView.vertical = vertical;
[UIView transitionWithView:self.carouselCell.carouselView
duration:0.2
options:0
animations:^{
self.carouselCell.carouselHeightConstraint.constant = vertical ? CGRectGetHeight(self.tableView.frame) : 230;
[self.carouselCell setNeedsUpdateConstraints];
[self.carouselCell updateConstraintsIfNeeded];
[self.tableView beginUpdates];
[self.tableView endUpdates];
completion:^(BOOL finished) {
}];
}
Comme vous pouvez le voir, j'essaie d'utiliser cette bonne vieille solution:
Pouvez-vous animez un changement de la hauteur sur une UITableViewCell lorsqu'il est sélectionné?
Et le résultat:
Ma cellule rétrécit à 44.0f
hauteur.
Question:
Pourquoi cela se produit? J'attends de voir ma cellule en douceur élargi avec la magie de l'auto-layot.
Remarque:
Je ne veux pas utiliser -tableView:heightForRowAtIndexPath:
. C'est de l'auto-mise en page de l'ère, droit?
- Vous devez toujours utiliser
tableView:heightForRowAtIndexPath:
. Ce n'est pas une auto-mise en page du travail. - ressemble beaucoup à de l'auto-présentation de l'emploi.
- Je suis totalement d'accord cela devrait maintenant être fait avec Mise en page Automatique. Je suis en train de faire toujours la même chose: l'ajout de contraintes sur la cellule contentView et de dire à la vue de la table pour animer la hauteur. Cependant, je ne pouvais pas le faire fonctionner jusqu'à présent. Avez-vous trouvé une solution pour ce problème?
- Je v fini par utiliser
tableView:heightForRowAtIndexPath:
. Il semble que la seule solution maintenant. Triste mais vrai. N'oubliez pas de mettre à jour vos contraintes correctement. - J'ai en fait à gérer pour résoudre mon problème, après que j'ai posté ce commentaire, et j'ai utilisé une pure auto-présentation de l'approche: pas d'utilisation de
tableView:heightForRowAtIndexPath:
. Si vous êtes toujours intéressé, vous pouvez consulter ma solution ici (ExpandableTableViewCell et le projet de l'échantillon). Il est encore beaucoup de travail en cours, même si (mais il fonctionne). - cool, je suis intéressé
- pas très bon à swift. Pourriez-vous brièvement post l'idée de la réponse?
Vous devez vous connecter pour publier un commentaire.
La suite fonctionné pour moi:
Préparation:
Sur
viewDidLoad
dire à la vue de la table à utiliser l'auto-dimensionnement des cellules:Ajouter les contraintes comme vous le feriez normalement, mais les ajouter à la cellule
contentView
!Animer hauteur:
Disons que vous changez une contrainte
constant
:...ou vous ajouter/supprimer des contraintes.
Pour animer cette modification, procédez comme suit:
Dire la contentView pour animer le changement:
Puis dire à la vue de la table de réagir au changement de la hauteur avec une animation
La durée de 0,3 sur la première étape est ce qui semble être la durée UITableView utilise pour ses animations lors de l'appel de commencer/endUpdates.
Bonus - changer la hauteur sans animation et sans recharger la totalité de la table:
Si vous voulez faire la même chose que ci-dessus, mais sans une animation, puis faire ceci à la place:
Résumé:
Vous pouvez consulter ma mise en œuvre de l'une des cellules qui se développe lorsque l'utilisateur sélectionne ici (pur Swift & pure mise en forme automatique - la voie de l'avenir).
reloadRowsAtIndexPaths:withRowAnimation:
avecUITableViewRowAnimationNone
sur la vue de la table de travail? Au lieu de désactiver les animations surUIView
etbeginUpdates
/endUpdates
.reloadRowsAtIndexPaths:withRowAnimation:
ne recharge pas la hauteur de cellule. Je crois que je vais essayer quelque chose d'autre" (il aurait pu être pour l'animation de la hauteur, cependant, pas une mise à jour instantanée).layoutIfNeeded
première mise à jour de la cellule la taille, puisreloadRowsAtIndexPaths:withRowAnimation:
de mettre à jour l'affichage de la table.[tableView beginUpdates]; [tableView endUpdates];
est très important, sans que vous obtiendrez de la contrainte des erreurs dans votre console qui n'a pas beaucoup de sens.J'aimerais ajouter quelques points à Alex de réponse.
Si vous appelez beginUpdates et endUpdates à l'intérieur de cellForRowAtIndexPath ou willDisplayCell, votre application crash. Après l'animation de votre cellule à la hausse, vous souhaitez peut-il rester le même après le défilement à votre tableView. Vous souhaitez peut-être également que le reste de l'cellules à garder leur hauteur la même. Mais rappelez-vous que les cellules sont réutilisables, donc vous risquez de vous retrouver avec d'autres cellules ayant augmenté la hauteur.
Comme un résultat, vous aurez à définir la contrainte constante à l'intérieur d'cellForRowAtIndexPath en fonction de l'élément qu'elle représente. Mais si vous appelez layoutIfNeeded par la suite, il affichera un message d'avertissement avec vos contraintes. Ma conviction est qu'il tente de générer de la cellule de mise en page avant sa nouvelle hauteur est calculée.