Обнаружение ScrollOffset в ScrollView внутри ViewController содержится в UIPageViewController? - PullRequest
0 голосов
/ 28 июня 2019

У меня есть UIPageViewController, который содержит массив ContentUIViewController, у них есть прокрутки в них.

Когда прокручивается прокрутка, я хочу распознать это в контроллере представления, который является родителем UIPageViewController (добавлено как ребенок)

Каков наилучший путь для достижения этой цели?как и в настоящее время, я попытался делегировать didScroll обратно в модель представления для ContentUIViewController, а затем передать его в родительский элемент UIPageViewController, чтобы отрегулировать высоту заголовка, которую я хочу свернуть, но она не работает хорошо / очень хакерская

Есть ли способ прочитать выходные данные делегата в дочернем vc родительском vc, не возвращая его через viewmodels?Это оказывается сложным из-за природы массива UIPageViewController, а не одного дочернего VC.

Обновлено:

private func generateContentControllers() -> [UIViewController] {
    var viewControllers: [UIViewController] = []
        viewControllers.append(ScrollableContentViewController(contentViews: infoViews))
        viewControllers.append(reviewsVC)
        viewControllers.append(ScrollableContentViewController(contentViews: helpViews))
    }
    return viewControllers
}

Предоставлено через

var scrollingViewControllers: [UIViewController] { get }

Добавленос

    if let firstViewController = self.viewModel.scrollingViewControllers.first {
        pagingController.setViewControllers([firstViewController], direction: .forward, animated: false)
    }

1 Ответ

1 голос
/ 28 июня 2019

Вот как вы можете заставить это работать.

1. Создайте handler in ContentUIViewController, который будет вызываться в scrollViewDidScroll(_:) методе для каждого contentOffset изменения.

class ContentUIViewController: UIViewController, UIScrollViewDelegate {
    var handler: ((CGPoint)->())?

    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        handler?(scrollView.contentOffset)
    }
}

2. В ParentVC создайте экземпляр UIPageViewController и добавьте его как child. Я думаю, что ты уже сделал это.

Далее вам нужно создать array из ContentUIViewController и для каждого экземпляра установить handler, который мы создали ранее.

Этот handler будет вызываться каждый раз, когда scrollView прокручивается в этом конкретном ContentUIViewController. Мы получим contentOffset из scrollView здесь. Вызовите updateHeaderHeight(for:) с полученным contentOffset, чтобы настроить header высоту.

class ViewModel {
    private func generateContentControllers() -> [ContentUIViewController] {
        var viewControllers: [ContentUIViewController] = []
        //add your code here....
        return viewControllers
    }

    lazy var scrollingViewControllers: [ContentUIViewController] = {
        return self.generateContentControllers()
    }()
}

class ParentVC: UIViewController {
    let viewModel = ViewModel()

    override func viewDidLoad() {
        super.viewDidLoad()
        self.viewModel.scrollingViewControllers.forEach {
            $0.handler = {(offset) in
                self.updateHeaderHeight(for: offset)
            }
        }
    }

    func updateHeaderHeight(for offset: CGPoint) {
        //add the code to adjust header height here...
    }

    //add rest of the code for pageViewController here....
}
...