10
votes

Animation du cadre d'Uilabel en douceur

J'ai essayé de trouver un moyen décent d'animer un changement de taille de cadre sur un Uilabel, sans un saut de départ bizarre. Ce qui se passe par défaut, c'est que lorsque je fais quelque chose comme ça:

// Assume myLabel frame starts as (0, 0, 100, 200) 
[UIView beginAnimations:@"myAnim" context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration:1.0];
myLabel.frame = CGRectMake(0.0, 0.0, 50, 100);
[UIView commitAnimations];  


1 commentaires

C'est une vieille question mais je me laisse avec exactement le même problème. D'une manière ou d'une autre c'est illogique. Si je comprends bien les méthodes d'animation, vous devriez pouvoir animer la plupart des propriétés sur une classe UIView. Mais pourquoi la propriété-cadre d'un Uilabel se comporte-t-elle différemment lorsqu'elle est animée qu'une sous-classe UIView normale. On dirait que la classe Uilabel ignore l'animation pour la taille et n'anime que le changement de localisation. Qui crée une animation plutôt étrange. J'apprécierais que quelqu'un puisse m'aider avec ça.


5 Réponses :


0
votes

Animation du cadre ne modifie pas la taille de la police. Si je comprends ce que votre comportement vous voyez, je pense que vous avez le réglage de la marque défini sur "true", donc vous voyez le cadre animé à la taille suivie du réajustement instantané de la taille de la police.

Vous pourriez essayer d'élargir la transformation de l'étiquette de sorte que l'échelle de la trame et de la police simultanément.


2 commentaires

En fait non, ce n'est pas le cas. Le RéglfontSizetofitThewidth n'est pas défini ici et je suis en fait pas essayer de changer la taille de la police, juste le cadre - qui est en jaune. Cependant, ce qui se passe est que le cadre DESTS (dans ce cas) "convient au texte, de sorte qu'il redessine d'abord que la couche s'étire pour s'adapter à la trame d'origine, puis la réduit. C'est pourquoi ça a l'air bizarre comme ça.


Pas sûr alors. C'est un problème intéressant. Je verrai si je ne peux pas le reproduire plus tard aujourd'hui. Je suis curieux moi-même.



38
votes

Hourra pour répondre à une question morte de deux ans, mais j'ai trouvé la réponse. Soit dans l'interface Builder ou dans le code, modifiez la propriété contentmode de l'étiquette. Le vôtre semble être défini sur ScaletOfill ; essayez gauche ou droit .


4 commentaires

Si je pouvais, je voudrais faire cette réponse avec 100! (Il saute toujours parfois, mais ça va)


TOPLETFT / Droite ou BottomFeft / Droite pourrait être la mesure de contenus correcte que vous souhaitez en fonction de l'animation exacte dont vous avez besoin.


Cela m'a sauvé la vie :)


Cette réponse 100% fonctionne, mais pour un peu plus de clarté, si mon .Textalignment était .Centier comme dans: myLabel.texttalignment = .Center , puis définissez le .ContentMode à: myLabel.contentMode = .center



7
votes

Pour développer la réponse de @ Cliclcly: de l'aperçu de la documentation de Uilabel:

Le mode de contenu par défaut de la classe Uilabel est UIViewContentModeredraw. Ce mode provoque la vue de redessiner Contenu Chaque fois que son rectangle de liaison change. Vous pouvez changer ce mode en modifiant la propriété héritée de typeMode de la classe.

de la documentation de la propriété contentmode d'UIView:

La valeur par défaut de cette propriété est UIViewContentModeScaleToFill.

Les Uilabels se comportent différemment des autres uiviews par défaut car leur propriété de mode de contenu est différente par défaut.


0 commentaires

-3
votes

désactive simplement la disposition automatique de votre étiquette.

en Xcode, cliquez sur l'étiquette, puis dans le volet Propriétés, décochez l'option de mise en page automatique


0 commentaires

6
votes

J'ai trouvé que les animations d'images UILabel sont bizarres - leur taille est définie à la taille immédiatement fin et le texte est rendu pour cette taille. Après que seul le changement de position est animée, ce qui signifie que si la taille de la destination est (0,0), l'étiquette disparaît immédiatement. Pour contourner cette limitation, je l'ai placé l'étiquette à l'intérieur d'une vue de la même taille que les clips, subviews Autoresizing désactivé pour l'étiquette, et je suis animant la superview de l'étiquette au lieu de l'étiquette elle-même. Le résultat final est que le cadre de l'étiquette est entièrement animé tout au long, mais le texte contenu n'est pas nouveau rendu avec, disons, une taille de police différente, ni ne change de troncature texte. Il est pas encore parfait, mais il est bon pour mon but.

Cadre initial:

trame initiale

Au cours de l'animation:

Au cours de l'animation

Animation terminé:

Animation terminé


1 commentaires

Je ne peux pas croire croire que je ne connaissais jamais ceci à propos de Uilabels. Mais vous m'avez aidé à résoudre un problème qui m'avait totalement soulevé - merci!