【问题标题】:How do I pan the image inside a UIImageView?如何在 UIImageView 中平移图像?
【发布时间】:2009-01-07 09:29:28
【问题描述】:

我有一个UIImageView,它显示的图像比UIImageView 更宽、更高。我想使用动画在视图中平移图像(以便平移美观且平滑)。

在我看来,我应该能够只调整UIImageViewbounds.origin,并且图像应该移动(因为图像应该在视图内绘制为 its起源,对吗?)但这似乎不起作用。 bounds.origin 发生变化,但图像绘制在同一位置。

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

我的视图当前通过 Interface Builder 将其 contentsGravity 设置为 kCAGravityTopLeft,如果这会有所不同(它会导致图像移动吗?)。不过,似乎没有其他选择更好。

更新:明确地说,我想将图像移入视图,同时将视图保持在同一位置。

【问题讨论】:

    标签: cocoa-touch core-animation


    【解决方案1】:

    我强烈建议将您的UIImageView 包含在UIScrollView 中。让UIImageView 显示完整图像,并将UIScrollView 上的 contentSize 设置为与您的UIImageView's 大小相同。您在图像中的window 将是UIScrollView 的大小,通过使用scrollRectToVisible:animated:,您可以以动画方式平移到图像上的特定区域。

    如果您不希望出现滚动条,可以将showsHorizontalScrollIndicatorshowsVerticalScrollIndicatorproperties 设置为NO

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

    【讨论】:

    • 但是这种情况下的动画太快了,以至于您实际上看不到图像,而只是目的地。
    • 将您的 scrollRectToVisible:animated: 方法调用封装在 UIView beginAnimations/commitAnimations 块中,并在该块的开头使用 UIView 的 setAnimationDuration:。这会覆盖默认动画持续时间。你可以让滚动视图以你想要的速度平移。
    • 这似乎并没有减慢滚动速度。这就是我正在做的事情:[UIView beginAnimations:@"bay pan" context:nil]; [UIView setAnimationDuration:10]; [UIView setAnimationDelegate:self]; [scrollView scrollRectToVisible:newRect 动画:YES]; [UIView 提交动画];
    • 这引导我走上正确的道路,所以我给你“接受”来给你声誉,然后发布我自己的答案来提供代码。
    【解决方案2】:

    Brad Larson 为我指明了正确的道路,他建议将 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;
    

    然后,我可以对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;
    

    我正在使用10.0f 中的speedInPixelsPerSecond,但其他应用程序可能想要使用不同的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-16
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多