I'm a bit stuck. I have a custom UIView which contains a timer and an UIImageView, that timer fires at a constant interval and changes the image from an array of images. This custom view works fine and is performant when I embed it within any other UIView. It changes images at the prescribed speed and doesn't have any issues. It works as I'd like.
This exact same view however, when placed inside a UITableVieCell that looks like the below, renders only the first image and does not change. I have confirmed that the timer is firing, and the the image view is changing its image under the hood by printing the reference to the UIImageView.image. That is to say, that when embedded within a UITableViewCell, my custom UIView is firing its timer and the UIImageView within this custom view, thinks it is changing its image. This leads me to believe that this is a display issue and not a data setting issue.
As a result, here is what have tried:
- I've tried wrapping it in
DispatchQueue.main.async{} - Adding a delegate so that my
UIViewControllercan calltableView.reloadData()when the timer is fired - Removing the setter of
multiImageView.imageson myprepareForReuse
Custom Cell Below
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)
})
}
}
Setting Images on Cell
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
}
CodePudding user response:
It appears that this is a bug on the iOS 15 simulator on M1 processors. The code functions perfectly on a real device but not on a simulator. I intend to file a radar for this.
