Использование другого вида прокрутки для прокрутки таблицы, ячейки не загружаются - PullRequest
0 голосов
/ 07 апреля 2020

У меня странное требование к пользовательскому интерфейсу, и мне нужно прокрутить табличное представление в виде страницы, используя представление прокрутки, в которое я встроил представление страницы. Например:

import UIKit

class TableVC: UIViewController {

    let tableView = UITableView()
    var observer: NSKeyValueObservation?


    override func viewDidLoad() {
        super.viewDidLoad()
        setupTableView()
    }

    func setupTableView() {
        view.addSubview(tableView)
        tableView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            tableView.topAnchor.constraint(equalTo: view.topAnchor),
            tableView.heightAnchor.constraint(equalToConstant: 2000)
        ])


        tableView.dataSource = self
        tableView.delegate = self
        tableView.isScrollEnabled = false
        tableView.backgroundColor = .blue

        let handler = { (tableView: UITableView, change: NSKeyValueObservedChange<CGSize>) in
            if let contentSize = change.newValue {
                print("contentSize:", contentSize)
            }
        }
        observer = tableView.observe(\UITableView.contentSize, options: [NSKeyValueObservingOptions.new], changeHandler: handler)
    }

}

extension TableVC: UITableViewDelegate {

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        50.0
    }

}

extension TableVC: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 40
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.backgroundColor = .green
        return cell
    }

}

И контроллер основного вида :

import UIKit

class ViewController: UIViewController {

    private enum Constants {
        static let pageViewControllerOptions: [UIPageViewController.OptionsKey: Any] = [
            .interPageSpacing: CGFloat(8.0)
        ]
    }

    private let pageVC: UIPageViewController = UIPageViewController(
        transitionStyle: .scroll,
        navigationOrientation: .horizontal,
        options: Constants.pageViewControllerOptions
    )

    let scrollView: UIScrollView = UIScrollView()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(scrollView)
        scrollView.pin(to: view)

        let stackView = UIStackView()
        stackView.axis = .vertical
        stackView.frame = view.bounds
        stackView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        scrollView.addSubview(stackView)

        let blueView = UIView()
        blueView.backgroundColor = .blue
        stackView.addArrangedSubview(blueView)
        blueView.translatesAutoresizingMaskIntoConstraints = false
        blueView.heightAnchor.constraint(equalToConstant: 100.0).isActive = true

        addChild(pageVC)
        pageVC.didMove(toParent: self)
        let pageView = pageVC.view!
        stackView.addArrangedSubview(pageView)
        pageVC.setViewControllers([TableVC()], direction: .forward, animated: false, completion: nil)

        // 50 height with 20 cells works fine
        // 50 height with 40 cells won't work beacuse it doesn't seem to load them all
        scrollView.contentSize = CGSize(width: view.bounds.width, height: 2000 + 100)

    }

}

С 40 ячейками, я ожидаю, что размер контента 2000, я установил это выше (с учетом высоты синий вид также). Прокрутка работает, но кажется, что в какой-то момент она перестала генерировать ячейки:

enter image description here

На рисунке выше вы можете увидеть, что их меньше 40 клетки. Я пытался использовать большую высоту представления таблицы, вызывая layoutIfNeeded, но результат тот же. Что я могу сделать, чтобы это исправить? Я предполагаю, что ячейки не загружаются, потому что я не использую собственное представление прокрутки табличного представления, поэтому cellForRow не запускается. Есть ли другой способ загрузки ячеек?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...