0 votes

Comment animer le redimensionnement d'un tableView sans que ses lignes/sous-vues soient coupées ?

EDIT : J'ai initialement posé cette question en ce qui concerne le redimensionnement général des vues, mais je réalise maintenant qu'il s'agit de quelque chose de beaucoup plus spécifique aux tableViews.

Supposons qu'un tableView ait à l'origine un cadre de (0 0, 320 460), c'est-à-dire qu'il remplisse tout l'écran d'un iPhone. Afin de redimensionner la hauteur du tableView et d'animer ce redimensionnement, j'associe le code suivant à un bouton :

[UIView beginAnimations:@"Animation" context:nil];
[UIView setAnimationDuration:3];

CGRect rect = self.table.bounds;
rect.size = CGSizeMake(320, 200);
self.table.bounds = rect;
self.table.center = CGPointMake(160, 100);

[UIView commitAnimations];

Ce code va animer la hauteur de la table vers le bas, MAIS... avant que l'animation ne se produise, la table va couper toutes les cellules de la table qui ne rentreront pas dans les nouvelles limites. Ainsi, avec un tableView de 10 rangées à l'origine, le code d'animation ci-dessus provoquera cette séquence d'événements :

  1. Le tableView supprime immédiatement les 5 dernières rangées. Notez qu'il ne supprime que les rangées - l'arrière-plan du tableView s'étend toujours jusqu'au bas.
  2. Le tableView anime le changement de hauteur pour le reste du tableau comme prévu.

Ce n'est pas le comportement que je recherche. Au lieu de couper immédiatement les 5 rangées inférieures, le tableView devrait garder ses rangées en place pendant que le bord inférieur du tableau s'anime vers le haut.

D'après le comportement que je constate, il semble que le tableView reçoive une sorte de message l'invitant à rafraîchir ses lignes immédiatement après avoir appris que ses limites allaient changer. Quelqu'un peut-il m'éclairer sur ce comportement et me dire comment l'éviter ?

1voto

Sean Points 677

La propriété Bounds d'une vue définit l'espace de coordonnées interne de la vue. Si vous modifiez la taille et/ou la position de la vue, vous ne devez modifier que le cadre de la vue. En théorie, la propriété bounds pourrait définir un espace de coordonnées totalement arbitraire, déconnecté du cadre englobant la vue, et UIKit est apparemment conçu pour supporter cette distinction. En pratique, je ne pense pas avoir jamais vu UIKit fonctionner de cette façon (bounds.size est toujours identique à frame.size et bounds.origin est toujours {0,0}), mais c'est la distinction qui est faite ici et il est important de s'en souvenir - surtout si ce comportement change à l'avenir.

Je ne suis pas certain qu'il suffise de modifier le code pour modifier le cadre au lieu des limites pour résoudre le problème, mais je recommande de commencer par là. Si cela ne résout pas le problème, alors le problème est probablement que le tableau supprime immédiatement les lignes qui deviendront invisibles avec le nouveau cadre, donc si c'est le cas, il est possible que la seule solution soit de faire l'animation vous-même en mettant en place une routine simple pilotée par NSTimer qui change lentement la taille/position des cadres au fil du temps, créant ainsi l'illusion que vous voulez malgré les optimisations du tableau ou les interactions avec Core Animation.

0voto

philsquared Points 13547

Avez-vous essayé de changer les limites et au centre du bloc d'animation.

Je ne connais pas ce cas précis, mais je me souviens avoir eu à faire la même chose auparavant. La relation entre le cadre, les limites et le centre peut parfois être frustrante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X