【问题标题】:What is the correct approach to show the image without distortion in collection view在集合视图中显示图像而不失真的正确方法是什么
【发布时间】:2016-08-25 04:40:46
【问题描述】:

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

概览

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

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

问题

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

我想出的解决方案

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

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

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

【问题讨论】:

  • 2.似乎最简单。我会选择 2,看看结果是否足够好(我打赌它会)。如果没有,请选择 1。
  • @deadbeef :感谢您的建议 :) 解决方案 2 的唯一问题是,在用户将设备旋转到所有方向之前,我不知道单元格的最大大小 :( 或者我会必须预先计算所有方向的大小,这应该很好,因为它几乎不涉及数学方程,并且应该比调整图像本身的大小更轻:D
  • 当设备转动时它们是否会变形?
  • @impression7vx :它的尺寸会略有不同 :) 如果我使用 scaleToFill 图像看起来会失真,因为 imageView 不会遵循图像的纵横比,但如果我选择 ScaleToFit 图像会保持其纵横比,但在图像视图中留下的空间很小,正如我上面解释的那样,这个空间因各种方向而异:)
  • 啊! scaleToFit 绝对是您的最佳选择!这是一个选项,而不是保存这么多数据。

标签: ios swift image sdwebimage


【解决方案1】:

如果这是个坏主意,请告诉我,但有可能的选择。

你可以

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

函数 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 而不是保存图像数据,希望可以删除空白。评论并让我看看你的想法。

【讨论】:

  • 谢谢哥们 :) 我感谢你的努力 :) 但是我不认为我可以更改 imageView 的大小,因为许多其他 UI 组件都使用自动布局约束与它相关联。所以改变 imageView 框架会破坏其中的一些,并可能导致应变 o/p。第二件事:是的,您是对的,它删除了空白区域,但为了使其正常工作,我必须进行此计算并为每个方向调整 imageView 的大小,不是吗 :) 无论如何,我会试一试: ) 因此投票赞成:)
  • 哈哈没问题!我希望你能做到这一点,就像我自己做的那样,只是周围没有按钮或任何东西:P 我不喜欢使用约束或情节提要,只需做一个imageView = UIImageView(frame: CGRect(...)) 然后当我需要更改它时我可以简单地说imageView.frame,但我是通过单击按钮而不是旋转完成的!但是让我知道它是否有效,我们将看看我们能从那里做些什么!
  • 如果侧面的按钮依赖于imageView.frame,您可能需要重新调整它们!
  • 当然,伙计 :) 我会更新你的 tomo :) 不幸的是,我无法摆脱故事板或自动布局约束,因为我的整个团队都在使用它 :) 无论如何谢谢你的时间 :) 我会在现在签字时通知你 tomo :P
猜你喜欢
  • 1970-01-01
  • 2015-02-22
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
相关资源
最近更新 更多