TAL*_*ama 26 cocoa-touch core-animation
我有一个UIImageView显示比更宽更高的图像UIImageView.我想使用动画在视图中平移图像(这样平底锅很漂亮和平滑).
在我看来,我应该能够仅仅调整bounds.origin的UIImageView,和图像应移动(因为形象应与作为视图中绘制它的起源,对不对?),但似乎并没有工作.的bounds.origin变化,但图像绘制在相同的位置.
几乎可以工作的是改变contentsRect视图的层.但这开始是一个单位正方形,即使图像的可视区域不是整个图像.所以我不确定如何检测到图像的远边被拉入可视区域(我需要避免,因为它通过将边缘拉伸到无限远来显示,看起来很好,低于标准杆).
我的视图目前已通过Interface Builder contentsGravity设置kCAGravityTopLeft,如果这有所不同(是否导致图像移动?).但是,没有其他选择似乎更好.
更新:要清楚,我想在视图内移动图像,同时保持视图在同一点.
Bra*_*son 47
我强烈建议你包围UIImageView在UIScrollView.有UIImageView显示完整的图像,并设置contentSize上UIScrollView是相同的UIImageView's尺寸.您window进入图像的大小将是UIScrollView,并且通过使用scrollRectToVisible:animated:您可以以动画方式平移到图像上的特定区域.
如果您不想显示滚动条,可以将showsHorizontalScrollIndicator和showsVerticalScrollIndicator属性设置为NO.
UIScrollView 还提供捏缩放功能,可能对您有用,也可能对您没用.
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)
我使用speedInPixelsPerSecond的10.0f,但其他应用程序可能需要使用不同的值.