2011-10-18 4 views
0

J'ai ce morceau de code qui est placé dans accelerometer: didAccelerate qui change le recadrage d'une image. Fondamentalement, lorsque vous inclinez un iPad, une image est tronquée (non redimensionnée), ce qui est exactement l'effet que je recherche. Note: self.xPos est effectuée par la position de l'accéléromètre.x.Animer le recadrage de UIView/UIImageView

UIImage *originalStringImage = [UIImage imageNamed:@"string.png"]; 
CGImageRef imageRef = CGImageCreateWithImageInRect([originalStringImage CGImage], CGRectMake(0.0f,0.0f, self.xPos+50.0f, 26.0f)); 
[self.stringImageView setImage:[UIImage imageWithCGImage:imageRef]]; 
self.stringImageView.frame = CGRectMake(10.0f, self.stringYPos, self.xPos+50.0f, 26.0f); 

Maintenant, je voudrais faire exactement la même chose, bien que comme une animation UIView. Quelque chose entre ces paramètres d'animation UIView:

UIImageView *pageStringImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10.0f, placeString, 0.0f, 42.0f)]; 

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDelay:2.0]; 
[UIView setAnimationDuration:3.0]; 
pageStringImageView.frame = CGRectMake(10.0f, placeString, 900.0f, 42.0f); 
UIImage *originalStringImage = [UIImage imageNamed:@"string.png"]; 
CGImageRef imageRef = CGImageCreateWithImageInRect([originalStringImage CGImage], CGRectMake(10.0f,placeString, pageStringImageView.frame.origin.x, 42.0f)); 
[pageStringImageView setImage:[UIImage imageWithCGImage:imageRef]]; 
[UIView commitAnimations]; 

Mais ce qui précède ne fonctionne pas du tout. En fait, il ne montre même pas l'image. Je crois que la principale difficulté ici est de changer dynamiquement la taille de l'image pendant l'exécution de l'animation UIView.

Des suggestions ou des questions?

Répondre

4

Cela devrait être assez simple à faire si vous utilisez les propriétés de mise à l'échelle de votre UIImageView (la propriété .contentMode). Les vues, y compris les vues d'image, peuvent afficher leur contenu de plusieurs façons. La valeur par défaut pour une vue d'image est de mettre à l'échelle le contenu, de sorte que lorsque vous modifiez les images/les limites de l'image, elle se rétrécit/se développe selon les besoins. Par conséquent, si vous utilisiez un bloc d'animation standard UIView pour ajuster le cadre d'un UIImageView, il animerait la mise à l'échelle ou le rétrécissement de l'image. Mais si vous modifiez la propriété .contentMode de la vue de l'image si vous modifiez le cadre, vous pouvez l'agrandir à la place.

Par exemple, UIViewContentModeLeft alignera le contenu avec le côté gauche de la vue, donc si vous ajustez la largeur de la vue, il sera «rogné» du côté droit. Consultez la documentation UIView pour voir toutes les valeurs que vous pouvez avoir pour contentMode. Donc, fondamentalement, il suffit d'animer le changement de cadre de votre vue, mais réglez le contentMode de manière appropriée pour vous donner l'effet de recadrage désiré. Vous devrez peut-être vous assurer que votre vue est définie sur les limites, même si j'ai l'impression que les vues d'images le font par défaut.

+0

Votre réponse a été très instructive. Bien joué! –

+1

En outre, la partie clip to bounds a fait la différence. Sans cela je ne pourrais pas le faire fonctionner: 'imageview.clipsToBounds = YES' –