在集合视图中不失真地显示图像的正确方法是什么

What is the correct approach to show the image without distortion in collection view

我有一个非常基本的问题,因此不发布任何代码。

俯视图

我有一个集合视图,它使用了我编写的自定义布局。所有这个自定义布局所做的是它应用一些数学并根据屏幕宽度找出放置在屏幕上的最佳单元格数量,并尝试使用填充来四舍五入额外的像素。因此,当集合视图改变其方向时,我的大部分单元格大小都会发生变化,尤其是在像 iPad Pro 这样的设备上。我的意思是,如果像元大小在纵向时为 300 x 300,则在横向时可能会变成 320 x 300。 (它们不是准确的值,只是想给出一个想法)

每个单元格中都有imageView,需要从服务器下载图片。我正在使用 SDWebImage。下载的图像比我的单元格大得多,我不想将这么大的图像加载到内存中,因此我决定在将图像下载到 SDWebImageCache 之前调整图像的大小。

问题

现在,由于我的单元格大小会根据设备方向发生变化,为了使图像看起来像素完美,每次设备为每个单元格旋转时,我都必须调整图像大小。但这会导致性能不佳。

我想出的办法

  1. 我必须在 SDWeImageCache 中为一个方向缓存两张图像,但这又会增加应用程序的内存占用。

  2. 找到最大尺寸的单元格将在各种方向中找到并将图像调整为该尺寸,然后将相同的图像用于所有较小的单元格尺寸,图像视图的模式设置为 AspectToFit。

请告诉我什么是正确的方法。我不需要代码,只需要想法。

让我知道这是否是个坏主意,但有可能的选择。

你可以

1) 获取原始图像大小。 保存这个。

func resetImage() {

2)判断图片是否宽>高

3) 如果宽度 > 高度,那么你知道这将是一张更长的图片。确定你想要多长时间。假设您想要大约 1/10* 单元格宽度的更宽图片

4) 相应地确定图像的高度。 ((1/10)/widthOfCell)*imageHeight

5) If (width > height) imageView.frame = CGRect(0, 0, 1/10*widthCell, height)

6) imageView.contentMode = .ScaleAspectFit, imageView.image = UIImage(named: "awesome")

7) 可能保存 imageView.size 以防再次旋转。

这允许您仅更改 imageView 而不是保存图像数据,希望能去除白色 space。评论让我看看你的想法。