我有UIImageView
显示的图像比UIImageView
更宽更高。我想使用动画在视图中平移图像(这样平底锅很漂亮和平滑)。
在我看来,我应该能够调整bounds.origin
的{{1}},图像应该移动(因为图像应该在视图内部绘制,因为它来源,对吗?)但这似乎不起作用。 UIImageView
更改,但图片位于同一位置。
几乎可行的是更改视图图层的bounds.origin
。但这开始是一个单位正方形,即使图像的可视区域不是整个图像。所以我不确定如何检测到图像的远边被拉入可视区域(我需要避免,因为它通过将边缘拉伸到无限远来显示,看起来很好,低于标准杆)。
我的视图目前通过Interface Builder将contentsRect
设置为contentsGravity
,如果这有所不同(是否导致图像移动?)。但是,没有其他选择似乎更好。
更新:要清楚,我想在视图中移动图像,同时将视图保持在同一位置。
答案 0 :(得分:47)
我强烈建议您将UIImageView
括在UIScrollView
中。让UIImageView
显示完整图片,并将UIScrollView
上的contentSize设置为与UIImageView's
尺寸相同。您window
进入图片的大小将是UIScrollView
的大小,使用scrollRectToVisible:animated:
,您可以动画方式平移到图片上的特定区域。
如果您不想显示滚动条,可以将showsHorizontalScrollIndicator
和showsVerticalScrollIndicator
属性设置为NO
。
UIScrollView
还提供了缩放缩放功能,这些功能可能对您有用,也可能没有用。
答案 1 :(得分:39)
Brad Larson向我指出了正确的道路,他建议将UIImageView
放在UIScrollView
内。
最后,我将UIImageView
放在UIScrollView
内,并设置了scrollView的contentSize
和 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];
在我的特定情况下,我正在平移到图像中的随机空间。为了找到一个合适的矩形来平移到和一个合适的持续时间以获得一个不错的恒定速度,我使用以下内容:
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
10.0f
,但其他应用可能希望使用不同的值。