2011-07-08 5 views
2

J'ai été aux prises avec un problème apparemment mineur dans la façon dont ma sous-classe UIView s'anime. J'ai vue mettre en place comme ceci:UIView Redimensionner Animation Glitches

self.contentMode = UIViewContentModeRedraw; 
self.contentStretch = CGRectMake(0.5f, 0.5f, 0.0f, 0.0f); 

La vue est essentiellement un rectangle qui a un coup de 3 pixels. Parce que je veux que la vue ne se déforme pas pendant le redimensionnement, j'ai la propriété contentStretch indiquant le milieu de la vue. Le problème est, la distorsion se produit pendant qu'elle se développe, mais elle est lisse en rétrécissant.

On dirait que mon bloc d'animation est assez simple; J'ai des séparés pour grandir et rétrécir. Voici le bloc de plus en plus:

[UIView animateWithDuration:0.5 animations:^{ 
    CGRect newRect = CGRectMake(20, 100, 200, 70); 
    [titleView setFrame:newRect]; 
}]; 

C'est assez difficile à décrire dans un poste, donc j'assemblé un projet de test qui isole uniquement les parties qui sont pertinentes à ce sujet. Si quelqu'un veut jeter un coup d'oeil?

http://dl.dropbox.com/u/2798577/ViewResizeTest2.0.zip

Vous pouvez voir lorsque vous appuyez sur le « grandir » bouton, côté gauche « problème technique » de la vue avant d'animer. Bien que clairement visible ici, c'est un peu pire dans mon vrai projet.

Je ne sais pas si c'est un bug dans mon code ou un problème avec le framework? En espérant que c'est l'ancien ...

Merci, Aaron.

Mise à jour Après avoir reçu généreux commentaires de Jacob, je suis retourné à mon application et à supprimer les réglages de contentMode comme UIViewContentModeRedraw, notant comme il le fait qu'il fonctionnera drawRect chaque fois qu'il anime, et peut-être que trame initiale est une partie du problème. Alors maintenant l'animation est lisse, mais elle s'anime à la mauvaise position, écrasant les côtés. J'ai mis à jour le projet lié à quelque chose qui reflète plus précisément ce qui se passe dans mon application.

Si je devais deviner, il semblerait que la propriété contentStretch ne fasse pas son travail. C'est redimensionner le tout et pas une région CGRect à l'intérieur selon mes instructions. Quelqu'un peut-il confirmer si je l'utilise correctement?

Répondre

2

Je l'ai compris maintenant; voici la réponse pour toute autre personne qui se heurte à ce problème.

La documentation de la propriété contentStretch de UIView ne donne pas l'historique complet. Dans mon cas, j'ai compris le but de contentStretch pour décrire un "échantillon" d'une zone qui devrait être modifiée en taille. Au lieu de cela, contentStretch doit décrire la région entière qui serait soumise à un redimensionnement. Cela a plus de sens maintenant que j'écris ceci, mais ce n'était pas évident pour moi avant.

Par conséquent, ma déclaration d'origine:

self.contentStretch = CGRectMake(0.5f, 0.5f, 0.0f, 0.0f); 

décrit un rect qui n'a pas de largeur ou la hauteur! Donc, cela n'a effectivement rien fait. Au lieu de cela, je me sers d'une rect qui comprend la plupart des limites de la vue, sauf pour les extrémités, que je ne voulais pas déformée par le changement de taille:

self.contentStretch = CGRectMake(0.2, 0, 0.7, 1); 

Notez que c'est un rect qui commence 20% dans l'axe des x, et couvre 70% de la largeur, à pleine hauteur. Dans les tailles que mon rect devait être, ceci l'a couvert magnifiquement.

Merci à Jacob pour ses conseils pour supprimer la propriété contentMode; c'était totalement inutile dans cette circonstance.

Cheers, Aaron.

1

Débarrassez-vous de la ligne suivante dans TitleView.m:

self.contentMode = UIViewContentModeRedraw; 

La raison pour laquelle vous ne voulez pas utiliser UIViewContentModeRedraw est parce qu'il affiche à nouveau le contenu de la vue lorsque son changement de bounds. D'où le premier cadre dentelé dans l'animation.

La valeur par défaut contentMode est UIViewContentModeScaleToFill, ce qui correspond à vos besoins.

+0

Merci pour ce Jacob. Je pense que vous avez résolu une partie du problème. Il semble toutefois avoir révélé une faiblesse dans mon application exemple. J'ai mis à jour l'application et j'ajouterai une note à ce sujet dans ma question. –