在UIPageViewController内的ViewController内的ScrollView中检测ScrollOffset?

时间:2019-06-28 10:07:47

标签: ios swift uiscrollview uipageviewcontroller

我有一个UIPageViewController,其中包含ContentUIViewController的数组,它们中有滚动视图。

当滚动视图滚动时,我想在UIPageViewController(作为子项添加)的父级的视图控制器中识别出这一点

实现此目标的最佳途径是什么?目前,我尝试将didScroll委派回ContentUIViewController的视图模型,然后将其馈送到UIPageViewController的父级中以调整要折叠的标题高度,但它没有工作正常/非常hacky

是否有一种方法可以将子vc中的委托输出读取到父vc,而又不通过视图模型将其反馈回来?由于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 个答案:

答案 0 :(得分:1)

这是如何使它工作的方法。

1。。在handler中创建一个ContentUIViewController,对于每次scrollViewDidScroll(_:)的更改将以contentOffset方法进行调用。

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

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

2。。在ParentVC中,创建一个UIPageViewController的实例,并将其作为一个child添加到其中。我想你已经做到了。

接下来需要做的是创建一个array的{​​{1}},并为每个实例设置我们之前创建的ContentUIViewController

每次在特定的handler中滚动handler时,都会调用此scrollView。我们将在此处获得ContentUIViewController中的contentOffset。用获得的scrollView调用updateHeaderHeight(for:)来调整contentOffset的高度。

header