用高分辨率替换低分辨率图像时保持完全相同的缩放位置

Posted

技术标签:

【中文标题】用高分辨率替换低分辨率图像时保持完全相同的缩放位置【英文标题】:Maintain exact same zoom position when replacing low res image with high res 【发布时间】:2018-04-24 18:11:13 【问题描述】:

我有一个用户可以放大的 UIScrollview。图片非常大(3MB+),所以我先下载低分辨率版本,然后在下载完成后加载大版本。

这是无缝的,除非用户放大了。

当我用高分辨率图像替换低分辨率图像时,如何保持精确的缩放?我基本上只是希望用户看到图像变得更清晰,而不是改变他们正在查看的内容。

一些示例尺寸以供参考:

低分辨率图像:(222,200),默认放大级别(双击时):4.55... 高分辨率图像:(1184,1067),默认放大级别:0.854... UIScrollview 本身基本上是全屏的 AspectFit (414.0,672.0)

这是我正在做类似事情的代码示例。用户还可以调整图像的亮度。在这种情况下,我将换出具有完全相同尺寸的图像,因此此代码可以工作,但如果尺寸发生变化,则不会。

// Get the frame & zoom scale of image before replacing it
let tempZoomScale = pageImageViews[pageToUse].zoomScale
let tempFrame = pageImageViews[pageToUse].contentOffset

// Replace the image with the newly formatted one
pageImageViews[pageToUse].display(image: imageToUse)

// Set the same zoom position as it was before we swapped the image
if (maintainZoomPosition == true) 
    pageImageViews[pageToUse].zoomScale = tempZoomScale
    pageImageViews[pageToUse].contentOffset = tempFrame

非常感谢任何建议!

谢谢

【问题讨论】:

你要替换缩放视图本身吗??? 是的,我正在使用 ImageScrollView 库 source,它有一个 displayImage 方法,可以将 ImageView 添加为子视图。 好的,但不要那样做。如果您只是在图像视图中用旧的 image 替换旧的 image,它将以相同的方式显示。如果你替换了可缩放视图,你真的把事情搞砸了,因为你失去了滚动视图关于事物如何缩放的想法和应用于可缩放视图的变换/偏移之间的联系。 【参考方案1】:

在将低分辨率图像替换为高分辨率图像时,如何保持精确的缩放?

就这么做——用高分辨率图像替换低分辨率图像。但是不要替换包含图像的图像view;这似乎是你的错误。这样做无异于干扰滚动视图的整个缩放机制,这就是导致您出现问题的原因。

【讨论】:

太棒了!感谢您的指导。进行了一些重构来更新我用来创建 ImageView 的库(如果不存在),如果已经存在则只需更新图像。现在就像一个魅力! ?【参考方案2】:

如果您将图像放在 UIImageView 中,并将其内容模式设置为 .scaleAspectFit,并且该图像视图具有设定的大小,那么将图像替换为更高分辨率的图像根本不会改变缩放级别。

【讨论】:

【参考方案3】:

你想做的工作从表现来看并不好。 更好的方法是在下载大图之前显示一些进度视图,然后替换图像并删除进度视图。

【讨论】:

以上是关于用高分辨率替换低分辨率图像时保持完全相同的缩放位置的主要内容,如果未能解决你的问题,请参考以下文章

内嵌图像质量低

在进行缩放手势时替换 ScrollViewer 中的图像

如何保持 UISlider 拇指小但分辨率更高的照片?

将图像从相机缩放到 UIImageView(并保持比例)

如何使用 OCR 从低分辨率图像中获得更好/准确的结果

iOS - 基于设备的不同图像或缩放相同的图像?