UITableView 单元格背景图像初始滚动滞后
UITableView Cell Background Images initial scroll lag
我有一个应用程序,其中有一个 table 视图严格从资产中提取单元格背景图像。我注意到由于将这些图像加载到 table 视图中,初始滚动时 fps 下降。 (如果我只是用黑框替换 UIImage 或提供所有相同的图像,则滚动是无缝的)。 table 视图中的所有图像首次加载后,滚动动作就没有延迟。
目前每张图片的大小在 1.8MB 到 3MB 之间。 3x 图像的纵横比约为 1125x295,1x 和 2x 设备的纵横比缩小。设置背景图像时也会调用 initial.scaleAspectFill,但我不知道这是否是问题所在。我发现 6s、X、ipad mini 和 pro.
存在这个问题
- 您建议背景图片的最大文件大小是多少?
- 如果我尝试在后台线程上拉取 UIImages,这是不允许的,因为 UIImages 需要在主线程上处理(xCode 错误)。
- 我是否应该尝试弄清楚如何预缓存这些图像?
这是设置背景图片的方法
fileprivate let backgroundImageView: UIImageView = {
let view = UIImageView(axId: "backgroundImage")
view.contentMode = .scaleAspectFill
view.layer.masksToBounds = true
return view
}()
在单元格的初始菜单中,backgroundImageView 作为子视图添加到 contentView
您可以执行 #2 从背景中提取图像。从 backgroundThread 加载图像到内存,然后通过 mainThread
分配它
fileprivate let backgroundImageView: UIImageView = {
let view = UIImageView()
DispatchQueue.global().async {
let image = getFromSource()
DispatchQueue.main.async {
view.image = image
view.contentMode = .scaleAspectFill
view.layer.masksToBounds = true
}
}
return view
}()
或者您可以使用 KingFisher 来缓存图像,它有自己的图像缓存方式。很整洁。
您可能还想实施 prepareForReuse,以便在要重新使用单元格时卸载以前的图像。
override func prepareForReuse() {
super.prepareForReuse()
//Do your clean up here
}
我有一个应用程序,其中有一个 table 视图严格从资产中提取单元格背景图像。我注意到由于将这些图像加载到 table 视图中,初始滚动时 fps 下降。 (如果我只是用黑框替换 UIImage 或提供所有相同的图像,则滚动是无缝的)。 table 视图中的所有图像首次加载后,滚动动作就没有延迟。
目前每张图片的大小在 1.8MB 到 3MB 之间。 3x 图像的纵横比约为 1125x295,1x 和 2x 设备的纵横比缩小。设置背景图像时也会调用 initial.scaleAspectFill,但我不知道这是否是问题所在。我发现 6s、X、ipad mini 和 pro.
存在这个问题- 您建议背景图片的最大文件大小是多少?
- 如果我尝试在后台线程上拉取 UIImages,这是不允许的,因为 UIImages 需要在主线程上处理(xCode 错误)。
- 我是否应该尝试弄清楚如何预缓存这些图像?
这是设置背景图片的方法
fileprivate let backgroundImageView: UIImageView = {
let view = UIImageView(axId: "backgroundImage")
view.contentMode = .scaleAspectFill
view.layer.masksToBounds = true
return view
}()
在单元格的初始菜单中,backgroundImageView 作为子视图添加到 contentView
您可以执行 #2 从背景中提取图像。从 backgroundThread 加载图像到内存,然后通过 mainThread
分配它 fileprivate let backgroundImageView: UIImageView = {
let view = UIImageView()
DispatchQueue.global().async {
let image = getFromSource()
DispatchQueue.main.async {
view.image = image
view.contentMode = .scaleAspectFill
view.layer.masksToBounds = true
}
}
return view
}()
或者您可以使用 KingFisher 来缓存图像,它有自己的图像缓存方式。很整洁。
您可能还想实施 prepareForReuse,以便在要重新使用单元格时卸载以前的图像。
override func prepareForReuse() {
super.prepareForReuse()
//Do your clean up here
}