#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. 🙂