UITableViewCell 中的 UIImageView 不更改图像
UIImageView within UITableViewCell not changing image
我有点卡住了。我有一个自定义 UIView
,其中包含一个计时器和一个 UIImageView
,该计时器以恒定间隔触发并从图像数组中更改图像。当我将它嵌入到任何其他 UIView
中时,此自定义视图工作正常并且性能良好。它以规定的速度更改图像并且没有任何问题。效果如我所愿。
然而,这个完全相同的视图,当放置在如下所示的 UITableVieCell
中时,只呈现第一张图像并且不会改变。我已经确认计时器正在启动,并且图像视图正在通过打印对 UIImageView.image
的引用来更改它的图像。也就是说,当嵌入 UITableViewCell
中时,我的自定义 UIView
正在触发其计时器,而此自定义视图中的 UIImageView
认为它正在更改其图像。这让我相信这是一个显示问题而不是数据设置问题。
结果,这是尝试过的方法:
- 我试过用
DispatchQueue.main.async{}
包装它
- 添加委托以便我的
UIViewController
可以在计时器启动时调用 tableView.reloadData()
- 在我的
prepareForReuse
上删除 multiImageView.images
的 setter
下面的自定义单元格
import UIKit
import SnapKit
final internal class MultiImageCell: UITableViewCell {
// MARK: - UI Elements
public var multiImageView: MultiPartImageView = MultiPartImageView()
// MARK: - Lifecycle
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
//Setup Cell
selectionStyle = .none
//Setup Section Title View
multiImageView.rotationSpeed = 0.3
contentView.addSubview(multiImageView)
//Setup Constraints
setupConstraints()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func prepareForReuse() {
super.prepareForReuse()
accessoryType = .none
multiImageView.images = []
}
override func layoutSubviews() {
super.layoutSubviews()
setupConstraints()
}
// MARK: - Functions
private func setupConstraints() {
//Setup Section View Constraints
multiImageView.snp.remakeConstraints({ (make) in
make.edges.equalToSuperview().inset(16)
make.width.height.equalTo(240)
})
}
}
在单元格上设置图像
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Check for Cell
guard let row = viewModel.row(at: indexPath) else {
return UITableViewCell()
}
// Setup Cell
let cell = tableView.dequeueReusableCell(withIdentifier: row.cellReuseIdentifier,
for: indexPath)
cell.textLabel?.text = viewModel.title(for: row, indexPath: indexPath)
cell.detailTextLabel?.text = row.detailText
cell.accessoryView = row.accessoryView
cell.accessoryType = row.accessoryType ?? .none
cell.imageView?.image = row.image
switch RowStyle(rawValue: row.cellReuseIdentifier) {
case .multiImageCell:
guard let multiImageCell: MultiImageCell = cell as? MultiImageCell else {
return cell
}
guard let multiImageRow: MultiImageRow = row as? MultiImageRow else {
return cell
}
multiImageCell.multiImageView.images = multiImageRow.images
default:
break
}
return cell
}
这似乎是 iOS 15 模拟器在 M1 处理器上的错误。该代码在真实设备上运行完美,但在模拟器上运行不佳。我打算为此提交一个雷达。
我有点卡住了。我有一个自定义 UIView
,其中包含一个计时器和一个 UIImageView
,该计时器以恒定间隔触发并从图像数组中更改图像。当我将它嵌入到任何其他 UIView
中时,此自定义视图工作正常并且性能良好。它以规定的速度更改图像并且没有任何问题。效果如我所愿。
然而,这个完全相同的视图,当放置在如下所示的 UITableVieCell
中时,只呈现第一张图像并且不会改变。我已经确认计时器正在启动,并且图像视图正在通过打印对 UIImageView.image
的引用来更改它的图像。也就是说,当嵌入 UITableViewCell
中时,我的自定义 UIView
正在触发其计时器,而此自定义视图中的 UIImageView
认为它正在更改其图像。这让我相信这是一个显示问题而不是数据设置问题。
结果,这是尝试过的方法:
- 我试过用
DispatchQueue.main.async{}
包装它
- 添加委托以便我的
UIViewController
可以在计时器启动时调用tableView.reloadData()
- 在我的
prepareForReuse
上删除
multiImageView.images
的 setter
下面的自定义单元格
import UIKit
import SnapKit
final internal class MultiImageCell: UITableViewCell {
// MARK: - UI Elements
public var multiImageView: MultiPartImageView = MultiPartImageView()
// MARK: - Lifecycle
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
//Setup Cell
selectionStyle = .none
//Setup Section Title View
multiImageView.rotationSpeed = 0.3
contentView.addSubview(multiImageView)
//Setup Constraints
setupConstraints()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func prepareForReuse() {
super.prepareForReuse()
accessoryType = .none
multiImageView.images = []
}
override func layoutSubviews() {
super.layoutSubviews()
setupConstraints()
}
// MARK: - Functions
private func setupConstraints() {
//Setup Section View Constraints
multiImageView.snp.remakeConstraints({ (make) in
make.edges.equalToSuperview().inset(16)
make.width.height.equalTo(240)
})
}
}
在单元格上设置图像
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// Check for Cell
guard let row = viewModel.row(at: indexPath) else {
return UITableViewCell()
}
// Setup Cell
let cell = tableView.dequeueReusableCell(withIdentifier: row.cellReuseIdentifier,
for: indexPath)
cell.textLabel?.text = viewModel.title(for: row, indexPath: indexPath)
cell.detailTextLabel?.text = row.detailText
cell.accessoryView = row.accessoryView
cell.accessoryType = row.accessoryType ?? .none
cell.imageView?.image = row.image
switch RowStyle(rawValue: row.cellReuseIdentifier) {
case .multiImageCell:
guard let multiImageCell: MultiImageCell = cell as? MultiImageCell else {
return cell
}
guard let multiImageRow: MultiImageRow = row as? MultiImageRow else {
return cell
}
multiImageCell.multiImageView.images = multiImageRow.images
default:
break
}
return cell
}
这似乎是 iOS 15 模拟器在 M1 处理器上的错误。该代码在真实设备上运行完美,但在模拟器上运行不佳。我打算为此提交一个雷达。