IOS 在多个 table 行中使用相同的 view/reference
IOS using same view/reference in multiple table rows
奇怪的是我在任何地方都找不到关于这个主题的任何内容。
基本上,我有一个简单的 UITableView,假设有 10 行。每行都有一个与之关联的用户,每个用户都有一个 "profile picture"。现在假设每行是由 2 个用户中的 1 个创建的,因此它将在每行中显示 2 张不同个人资料图片中的 1 张。
我正在努力提高内存效率,所以我不想在新的 UIImageView 中加载同一张图片 5 次。因此,我尝试在同一用户的每一行中使用完全相同的 UIImageView 引用,但似乎只有加载的最后一行显示了 ImageView。例如,如果屏幕外的一行变得可见并重新加载,则图像将出现在该行并从它之前出现的行中消失。
所以我的问题是,我该怎么做?
一个。我正在尝试解决的问题 do/something 我失踪了
乙。 IOS 如果我在新的 UIImageView 中使用它,将不会再次将相同的图像加载到内存中,所以我只是在浪费时间担心这个
C。一个让我大吃一惊的新解决方案
谢谢!
史蒂夫
*请注意,我在 Xamarin/Mono 中构建它,但我认为 C# 与 Objective C 在这种情况下不会有什么不同
UIImage
具有内置缓存,因此选项 B 很可能是您的解决方案。由于此缓存,可能无需保留单个 UIImage
实例以在每个 UIImageView
中使用。虽然这种方法可能会略微加快您的应用程序,但更可能是 premature optimization.
此外,UITableView
进行了高度优化,可以重复使用移出屏幕的单元格,因此您的 UIImageView
实例数量与可见的 UITableViewCell
实例数量相同。
您的问题是由于 UIView
s 一次最多只能有一个超级视图。因此,每次您将单个实例添加到一个单元格时,它都会从前一个单元格中删除自己。这就是为什么你只在最后一个单元格上看到它的原因。
我认为您误解了 iOS 如何绘制图像。您将需要在显示图像的每个位置创建多个 UIImageViews
,但您可以(并且应该)重用 UIImage
对象,这才是真正消耗内存的原因。
因此,在您的 cellForRowAtIndexPath
方法中,只需创建一个 imageView 并将其设置为您已经加载的图像。
重复使用图像,而不是 imageViews。
奇怪的是我在任何地方都找不到关于这个主题的任何内容。
基本上,我有一个简单的 UITableView,假设有 10 行。每行都有一个与之关联的用户,每个用户都有一个 "profile picture"。现在假设每行是由 2 个用户中的 1 个创建的,因此它将在每行中显示 2 张不同个人资料图片中的 1 张。
我正在努力提高内存效率,所以我不想在新的 UIImageView 中加载同一张图片 5 次。因此,我尝试在同一用户的每一行中使用完全相同的 UIImageView 引用,但似乎只有加载的最后一行显示了 ImageView。例如,如果屏幕外的一行变得可见并重新加载,则图像将出现在该行并从它之前出现的行中消失。
所以我的问题是,我该怎么做?
一个。我正在尝试解决的问题 do/something 我失踪了
乙。 IOS 如果我在新的 UIImageView 中使用它,将不会再次将相同的图像加载到内存中,所以我只是在浪费时间担心这个
C。一个让我大吃一惊的新解决方案
谢谢!
史蒂夫
*请注意,我在 Xamarin/Mono 中构建它,但我认为 C# 与 Objective C 在这种情况下不会有什么不同
UIImage
具有内置缓存,因此选项 B 很可能是您的解决方案。由于此缓存,可能无需保留单个 UIImage
实例以在每个 UIImageView
中使用。虽然这种方法可能会略微加快您的应用程序,但更可能是 premature optimization.
此外,UITableView
进行了高度优化,可以重复使用移出屏幕的单元格,因此您的 UIImageView
实例数量与可见的 UITableViewCell
实例数量相同。
您的问题是由于 UIView
s 一次最多只能有一个超级视图。因此,每次您将单个实例添加到一个单元格时,它都会从前一个单元格中删除自己。这就是为什么你只在最后一个单元格上看到它的原因。
我认为您误解了 iOS 如何绘制图像。您将需要在显示图像的每个位置创建多个 UIImageViews
,但您可以(并且应该)重用 UIImage
对象,这才是真正消耗内存的原因。
因此,在您的 cellForRowAtIndexPath
方法中,只需创建一个 imageView 并将其设置为您已经加载的图像。
重复使用图像,而不是 imageViews。