如何在UIImageView中平移图像?

TAL*_*ama 26 cocoa-touch core-animation

我有一个UIImageView显示比更宽更高的图像UIImageView.我想使用动画在视图中平移图像(这样平底锅很漂亮和平滑).

在我看来,我应该能够仅仅调整bounds.originUIImageView,和图像应移动(因为形象应与作为视图中绘制它的起源,对不对?),但似乎并没有工作.的bounds.origin变化,但图像绘制在相同的位置.

几乎可以工作的是改变contentsRect视图的层.但这开始是一个单位正方形,即使图像的可视区域不是整个图像.所以我不确定如何检测到图像的远边被拉入可视区域(我需要避免,因为它通过将边缘拉伸到无限远来显示,看起来很好,低于标准杆).

我的视图目前已通过Interface Builder contentsGravity设置kCAGravityTopLeft,如果这有所不同(是否导致图像移动?).但是,没有其他选择似乎更好.

更新:要清楚,我想在视图移动图像,同时保持视图在同一点.

Bra*_*son 47

我强烈建议你包围UIImageViewUIScrollView.有UIImageView显示完整的图像,并设置contentSize上UIScrollView是相同的UIImageView's尺寸.您window进入图像的大小将是UIScrollView,并且通过使用scrollRectToVisible:animated:您可以以动画方式平移到图像上的特定区域.

如果您不想显示滚动条,可以将showsHorizontalScrollIndicatorshowsVerticalScrollIndicator属性设置为NO.

UIScrollView 还提供捏缩放功能,可能对您有用,也可能对您没用.

  • 将您的scrollRectToVisible:animated:方法调用封装在UIView beginAnimations / commitAnimations块中,并在该块的开头使用UIView的setAnimationDuration:。这将覆盖默认的动画持续时间。您可以按照自己的意愿使滚动视图平移。 (2认同)

TAL*_*ama 39

布拉德拉尔森指出我正确的道路,他的建议是把UIImageView内线放进去UIScrollView.

最后,我把UIImageView的内部UIScrollView,并设置了滚动的contentSize imageView的界限是大小的UIImage的图像相同的:

UIImage* image = imageView.image;
imageView.bounds = CGRectMake(0, 0, image.size.width, image.size.height);
scrollView.contentSize = image.size;
Run Code Online (Sandbox Code Playgroud)

然后,我可以为scrollView设置动画contentOffset以实现漂亮的平移效果:

[UIView beginAnimations:@"pan" context:nil];
[UIView setAnimationDuration:animationDuration];
scrollView.contentOffset = newRect.origin;
[UIView commitAnimations];
Run Code Online (Sandbox Code Playgroud)

在我的特定情况下,我正在平移到图像中的随机空间.为了找到适当的矩形平移到适当的持续时间以获得良好的恒定速度,我使用以下内容:

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;
Run Code Online (Sandbox Code Playgroud)

我使用speedInPixelsPerSecond10.0f,但其他应用程序可能需要使用不同的值.