iOS 15 Проблема с перезагрузкой UITableViewCell

#swift #uitableview #uikit #ios15

#быстрый #uitableview #уикит #ios15

Вопрос:

До iOS 15 ячейка загружается идеально. Но после загрузки iOS 15 она загружается неправильно. В чем может быть причина неправильной загрузки ячейки?

Я использую SnapKit для ограничений, и эта ошибка специфична для сборки iOS 15.

 var data: [MiniModule] = [] {  didSet {  var height: CGFloat = 0  // SCREEN WIDTH //  let w = UIApplication.shared.statusBarFrame.width  for i in data {  let width = w - 8*padding - 22  let h = i.title.description.height(withConstrainedWidth: width, font: TextProperty.gameButton.font)  height  = h  }  let headerHeight: CGFloat = topic == "" ? 0 : 20  tableView.snp.updateConstraints { (make) in  make.height.equalTo(headerHeight   (((3.5*padding) 18)*CGFloat(data.count))   height) //should be 18  }  layoutIfNeeded()  tableView.reloadData()  }  }  lazy var tableView: UITableView = {  let tv = UITableView()  tv.estimatedRowHeight = 80  tv.sectionFooterHeight = 0  if #available(iOS 15.0, *) {  tv.sectionHeaderTopPadding = 0  }  tv.rowHeight = UITableView.automaticDimension  tv.register(MiniCell.self, forCellReuseIdentifier: "cell")  tv.register(LibraryHeaderTVView.self, forHeaderFooterViewReuseIdentifier: "header")  tv.backgroundColor = .clear  tv.delegate = self  tv.dataSource = self  tv.isScrollEnabled = false  tv.separatorStyle = .none  return tv  }()   func setupViews() {  backgroundColor = .clear  self.contentView.addSubview(containerView)  self.contentView.addSubview(tableView)  tableView.snp.makeConstraints { (make) in  make.top.equalTo(self.contentView).offset(padding)  make.height.equalTo(210)  make.left.equalTo(self.contentView).offset(padding)  make.right.equalTo(self.contentView).offset(-padding)  make.bottom.equalTo(self.contentView).offset(-padding)  }  containerView.snp.makeConstraints { (make) in  make.left.equalTo(tableView)  make.right.equalTo(tableView)  make.top.equalTo(tableView).offset(-padding/2)  make.bottom.equalTo(tableView).offset(padding/2)  }  layoutIfNeeded()  }  extension EnrolledDetailsListTVCell: UITableViewDelegate, UITableViewDataSource {    func numberOfSections(in tableView: UITableView) -gt; Int {  return 1  }    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -gt; Int {  return data.count  }    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -gt; UITableViewCell {  guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? MiniCell else { return UITableViewCell()}  cell.indexLabel.textColor = theTextColor  cell.indexLabel.backgroundColor = theBackgroundColor  cell.indexLabel.text = "(indexPath.row 1)"  cell.type = data[indexPath.row].type  cell.descLabel.attributedText = data[indexPath.row].title.getHtmlAttributedString(font: TextProperty.gameButton.font, color: TextProperty.title.color)  let count = data[indexPath.row].bites.count  cell.countLabel.text = data[indexPath.row].type == .completed ? "(count)/(count)" : "0/(count)"  cell.isSeparatorHidden = indexPath.row == data.count-1  return cell  }    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -gt; UIView? {  if topic == "" { return nil }  let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: "header") as! LibraryHeaderTVView  header.titleLabel.text = " (topic)"  return header  }    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -gt; CGFloat {  if topic == "" { return 1 }  return 30  }    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {  tableView.deselectRow(at: indexPath, animated: true)  delegate?.rowSelected(module: data[indexPath.row])  } }  

Я попытался решить эту проблему, но это оказало такое же влияние на первый свиток, а не на второй. Ячейка загрузилась после второго прокрутки.

Изменить код 1 Ячейки:

 class MiniCell: UITableViewCell {    lazy var indexLabel: UILabel = {  let l = UILabel()  l.font = TextProperty.miniIndex.font  l.textColor = TextProperty.subTitle.color  l.numberOfLines = 0  l.textAlignment = .center  l.layer.cornerRadius = 11.0  l.clipsToBounds = true  return l  }()    lazy var descLabel: UILabel = {  let l = UILabel()  l.font = TextProperty.gameButton.font  l.textColor = TextProperty.title.color  l.numberOfLines = 0  return l  }()    lazy var countLabel: UILabel = {  let l = UILabel()  l.font = TextProperty.subTitle.font  l.textColor = TextProperty.subTitle.color  l.text = "1"  return l  }()    lazy var checkmarkImageView: UIImageView = {  let i = UIImageView()  i.contentMode = .scaleAspectFit  i.tintColor = Color.goalGreen.value  return i  }()    lazy var separatorView: UIView = {  let v = UIView()  v.backgroundColor = UIColor.black.withAlphaComponent(0.15)  return v  }()    var timer: Timer?    var isSeparatorHidden = false {  didSet {  separatorView.isHidden = isSeparatorHidden  }  }    var type: MiniCellType = .intro {  didSet {  accessoryType = .none  switch type {  case .completed:  indexLabel.alpha = 1  descLabel.alpha = 1  countLabel.alpha = 1  checkmarkImageView.image = UIImage(named: "green tick")  checkmarkImageView.alpha = 1  checkmarkImageView.isHidden = false  timer?.invalidate()  case .inProgress:  indexLabel.alpha = 1  descLabel.alpha = 1  countLabel.alpha = 1  checkmarkImageView.isHidden = false  checkmarkImageView.image = UIImage(named: "active course")  checkmarkImageView.alpha = 1  timer?.invalidate()  timer = Timer.scheduledTimer(timeInterval: 0.55, target: self, selector: #selector(glow), userInfo: self, repeats: true)  case .unlocked:  indexLabel.alpha = 1  descLabel.alpha = 1  countLabel.alpha = 1  accessoryType = .disclosureIndicator  checkmarkImageView.isHidden = true  timer?.invalidate()  case .pro:  indexLabel.alpha = 0.4  descLabel.alpha = 0.4  countLabel.alpha = 0.4  checkmarkImageView.image = UIImage(named: "lock icon")  checkmarkImageView.alpha = 1  checkmarkImageView.isHidden = false  timer?.invalidate()  case .intro:  indexLabel.alpha = 1  checkmarkImageView.isHidden = true  checkmarkImageView.alpha = 1  descLabel.alpha = 1  countLabel.alpha = 1  timer?.invalidate()  }  }  }    override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {  super.init(style: style, reuseIdentifier: reuseIdentifier)  setupViews()  }    required init?(coder aDecoder: NSCoder) {  fatalError("init(coder:) has not been implemented")  }    func setupViews() {  addSubview(indexLabel)  addSubview(descLabel)  addSubview(countLabel)  addSubview(checkmarkImageView)  addSubview(separatorView)   indexLabel.snp.makeConstraints { (make) in  make.left.equalTo(self).offset(padding)  make.centerY.equalTo(self)  make.size.equalTo(22)  }  descLabel.snp.makeConstraints { (make) in  make.left.equalTo(indexLabel.snp.right).offset(padding)  make.right.equalTo(self).offset(-4*padding)  make.top.equalTo(self).offset(1.5*padding)  }  countLabel.snp.makeConstraints { (make) in  make.left.right.equalTo(descLabel)  make.top.equalTo(descLabel.snp.bottom).offset(padding/2)  make.bottom.equalTo(self).offset(-1.5*padding)  }  checkmarkImageView.snp.makeConstraints { (make) in  make.right.equalTo(self).offset(-padding)  make.centerY.equalTo(self)  make.size.equalTo(22)  }  separatorView.snp.makeConstraints { (make) in  make.bottom.equalTo(self)  make.left.equalTo(indexLabel)  make.right.equalTo(self)  make.height.equalTo(1)  }  }    @objc func glow() {  let alpha = checkmarkImageView.alpha  UIView.animate(withDuration: 0.5) { [weak self] in  self?.checkmarkImageView.alpha = alpha != 1 ? 1 : 0.5  }  } }  

Неправильная загрузка изображения UITableViewCell

Комментарии:

1. Что вы имеете в виду, когда ячейка не загружается? Он спрятан? Когда вы говорите, что он загружается неправильно, чего вы ожидаете от что на самом деле происходит?

2. Согласно данному изображению, там, где есть свободное место, должна быть ячейка, но она не показана. В этом свободном пространстве должна появиться ячейка. В iOS 14 и ниже он появляется, но в iOS 15 его нет.

3. Вы должны опубликовать код для своих ячеек

4. Я добавил код для ячеек. До сих пор не могу понять, в чем причина этой проблемы с загрузкой ячеек.