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.
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.
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 showsVerticalScrollIndicator
properties à NO
.
UIScrollView
fournit également une fonctionnalité de zoom pincée, qui peut ou non être utile pour vous.