UIImageView
よりも幅が広くて背の高い画像を表示しているUIImageView
があります。アニメーションを使用して、ビュー内で画像をパンしたいと思います(パンが素晴らしく、滑らかになるように)。
UIImageView
のbounds.Origin
を調整するだけで、画像が移動するはずです(画像がビュー内にits)でペイントされるため Origin、そうですか?)しかし、それはうまくいかないようです。 bounds.Origin
は変わりますが、画像は同じ場所に描画されます。
ほとんど機能するのは、ビューのレイヤーのcontentsRect
を変更することです。ただし、画像の表示可能領域が画像全体ではない場合でも、これは単位正方形として始まります。したがって、画像の遠いエッジが表示可能領域に引き込まれていることをどのように検出するかわかりません(エッジを無限に伸ばして表示するため、回避する必要があります。 )。
現在、ビューのcontentsGravity
は、Interface Builderを介してkCAGravityTopLeft
に設定されています(違いがある場合)(画像が移動するのでしょうか)。しかし、他に良いオプションはないようです。
更新:明確にするために、ビューを同じ場所に維持しながら、イメージを移動したい内部ビュー。
ブラッド・ラーソンは、UIImageView
をUIScrollView
の中に入れるようにとの彼の提案で、私を正しい道に向けました。
最後に、UIImageView
をUIScrollView
の内側に置き、scrollViewのcontentSize
andを設定して、imageView
の境界をUIImageの画像と同じサイズ:
UIImage* image = imageView.image;
imageView.bounds = CGRectMake(0, 0, image.size.width, image.size.height);
scrollView.contentSize = image.size;
次に、scrollViewのcontentOffset
をアニメーション化して、素晴らしいパン効果を実現できます。
[UIView beginAnimations:@"pan" context:nil];
[UIView setAnimationDuration:animationDuration];
scrollView.contentOffset = newRect.Origin;
[UIView commitAnimations];
私の特定のケースでは、画像のランダムなスペースにパンしています。パンするための適切な四角形toと、ニースの一定速度を得るための適切な継続時間を見つけるために、以下を使用します。
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;
私はspeedInPixelsPerSecond
of 10.0f
を使用していますが、他のアプリケーションでは別の値を使用したい場合があります。
UIImageView
をUIScrollView
で囲むことを強くお勧めします。 UIImageView
に画像全体を表示させ、UIScrollView
のcontentSizeをUIImageView's
のサイズと同じになるように設定します。画像へのwindow
はUIScrollView
のサイズになります。scrollRectToVisible:animated:
を使用すると、画像の特定の領域にアニメーションでパンできます。
スクロールバーを表示したくない場合は、showsHorizontalScrollIndicator
およびshowsVerticalScrollIndicator
propertiesをNO
に設定できます。
UIScrollView
は、ピンチズーム機能も提供します。