web-dev-qa-db-fra.com

Comment panoramique l'image dans un UIImageView?

J'ai un UIImageView qui affiche une image plus large et plus grande que le UIImageView est. Je voudrais paniquer l'image dans la vue à l'aide d'une animation (afin que la casserole soit agréable et lisse).

Il me semble que je devrais pouvoir simplement ajuster le bounds.Origin du UIImageView, et l'image doit bouger (car l'image doit peindre à l'intérieur de la vue avec celle son . ?) Mais cela ne semble pas fonctionner. Les bounds.Origin Modifications, mais l'image s'appuie dans le même endroit.

Ce qui fonctionne presque est de changer le contentsRect du calque de la vue. Mais cela commence comme un carré de l'unité, même si la zone visible de l'image n'est pas l'image entière. Donc, je ne sais pas comment je voudrais détecter que le bord fort de l'image est tiré dans la zone visible (que je dois éviter, car il s'affiche en étirant le bord à l'infini, ce qui semble, bien, sous-paragraphe ).

Mon point de vue a actuellement son contentsGravity défini sur kCAGravityTopLeft via interface Builder, si cela fait une différence (est-ce que cela provoque la déplacement de l'image?). Aucune autre option ne semblait être meilleure, cependant.

Mise à jour: Pour être clair, je veux déplacer l'image à l'intérieur la vue, tout en gardant la vue au même endroit.

26
TALlama

Brad Larson m'a pointé sur la bonne route avec sa suggestion de mettre le UIImageView à l'intérieur d'un UIScrollView.

En fin de compte, j'ai placé le UIImageView à l'intérieur d'un UIScrollView et définissez le ScrollView's contentSize et Les limites imageView 's sont de la même taille que l'image dans l'UIImage:

UIImage* image = imageView.image;
imageView.bounds = CGRectMake(0, 0, image.size.width, image.size.height);
scrollView.contentSize = image.size;

Ensuite, je peux animer le ScrollView's _ contentOffset pour obtenir un bel effet panoramique:

[UIView beginAnimations:@"pan" context:nil];
[UIView setAnimationDuration:animationDuration];
scrollView.contentOffset = newRect.Origin;
[UIView commitAnimations];

Dans mon cas particulier, je panne dans un espace aléatoire dans l'image. Afin de trouver un recttacle correct à la casserole à et une durée appropriée pour obtenir une belle vitesse constante, j'utilise ce qui suit:

UIImage* image = imageView.image;

float xNewOrigin = [TCBRandom randomIntLessThan:image.size.width - scrollView.bounds.size.width];
float yNewOrigin = [TCBRandom randomIntLessThan:image.size.height - scrollView.bounds.size.height];

CGRect oldRect = scrollView.bounds;
CGRect newRect = CGRectMake(
    xNewOrigin,
    yNewOrigin, 
    scrollView.bounds.size.width,
    scrollView.bounds.size.height);

float xDistance = fabs(xNewOrigin - oldRect.Origin.x);
float yDistance = fabs(yNewOrigin - oldRect.Origin.y);
float hDistance = sqrtf(powf(xDistance, 2) + powf(yDistance, 2));
float hDistanceInPixels = hDistance;

float animationDuration = hDistanceInPixels / speedInPixelsPerSecond;

J'utilise un speedInPixelsPerSecond de 10.0f, mais d'autres applications peuvent vouloir utiliser une valeur différente.

39
TALlama

Je vous recommande vivement de joindre votre UIImageView dans un UIScrollView. Avoir le UIImageView affiche l'image complète et définissez le contenu sur le UIScrollView pour être identique à votre UIImageView's Taille. Votre window dans l'image sera la taille du UIScrollView et en utilisant scrollRectToVisible:animated: Vous pouvez paniquer dans des zones particulières sur l'image de manière animée.

Si vous ne voulez pas que les barres de défilement apparaissent apparaissent, vous pouvez définir les showsHorizontalScrollIndicator et showsVerticalScrollIndicatorproperties à NO.

UIScrollView fournit également une fonctionnalité de zoom pincée, qui peut ou non être utile pour vous.

47
Brad Larson