UITableViewCell 中的 UIImageView 不更改图像

UIImageView within UITableViewCell not changing image

我有点卡住了。我有一个自定义 UIView,其中包含一个计时器和一个 UIImageView,该计时器以恒定间隔触发并从图像数组中更改图像。当我将它嵌入到任何其他 UIView 中时,此自定义视图工作正常并且性能良好。它以规定的速度更改图像并且没有任何问题。效果如我所愿。

然而,这个完全相同的视图,当放置在如下所示的 UITableVieCell 中时,只呈现第一张图像并且不会改变。我已经确认计时器正在启动,并且图像视图正在通过打印对 UIImageView.image 的引用来更改它的图像。也就是说,当嵌入 UITableViewCell 中时,我的自定义 UIView 正在触发其计时器,而此自定义视图中的 UIImageView 认为它正在更改其图像。这让我相信这是一个显示问题而不是数据设置问题。

结果,这是尝试过的方法:

  1. 我试过用DispatchQueue.main.async{}
  2. 包装它
  3. 添加委托以便我的 UIViewController 可以在计时器启动时调用 tableView.reloadData()
  4. 在我的 prepareForReuse
  5. 上删除 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 处理器上的错误。该代码在真实设备上运行完美,但在模拟器上运行不佳。我打算为此提交一个雷达。