UITableViewCell неверный расчет динамической высоты с помощью SwiftUI внутри в iOS 15

#uitableview #swiftui #ios15

Вопрос:

Я пытаюсь использовать SwiftUI view внутри UITableViewCell, который отлично работает до iOS 15. В iOS 15, когда я прокручиваю представление таблицы и как только начальные видимые ячейки исчезают с экрана, а новые ячейки используются повторно, к ним добавляется дополнительная высота.

введите описание изображения здесь

Ниже приведен исходный код.

 import UIKit import SwiftUI  class ViewController: UIViewController {   @IBOutlet weak var tableView: UITableView?   override func viewDidLoad() {  super.viewDidLoad()  tableView?.register(TableViewCell.self, forCellReuseIdentifier: "cell")  tableView?.rowHeight = UITableView.automaticDimension  tableView?.estimatedRowHeight = 100  tableView?.separatorColor = .white  tableView?.dataSource = self  } }  extension ViewController: UITableViewDataSource {  func numberOfSections(in tableView: UITableView) -gt; Int {  1  }   func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -gt; Int {  20  }   func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -gt; UITableViewCell {  let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as? TableViewCell  return cell ?? UITableViewCell()  } }  class TableViewCell: UITableViewCell {   var stackView: UIStackView = {  let stack = UIStackView(frame: .zero)  stack.axis = .vertical  return stack  }()   override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {  super.init(style: style, reuseIdentifier: reuseIdentifier)  setupView()  }    required init?(coder: NSCoder) {  super.init(coder: coder)  setupView()  }    func setupView() {  contentView.clipsToBounds = true  contentView.addSubview(stackView)  stackView.translatesAutoresizingMaskIntoConstraints = false  stackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).isActive = true  stackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor).isActive = true  stackView.topAnchor.constraint(equalTo: contentView.topAnchor).isActive = true  stackView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor).isActive = true  let hosting = UIHostingController(rootView: TestView())  stackView.addArrangedSubview(hosting.view)  hosting.view.backgroundColor = .red  }  }  struct TestView: View {  var body: some View {  Rectangle()  .fill(Color.green)  .frame(height: 100)  } }  

Любая помощь будет высоко оценена. Спасибо

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

1. Когда вы смешиваете UIKit и SwiftUI, почти всегда вы несете ответственность за определение размеров и выравнивание. Это не ошибка.

2. Спасибо @Asperi, но эта штука работала совершенно нормально до iOS 14.x, я думаю, что в iOS 15 что-то изменилось и далее.

3. Как обычно… что-то всегда меняется, когда появляется новая версия операционной системы Apple. 🙂