我有一个UIPageViewController
,它包含一个ContentUIViewController
数组,其中有滚动视图。
当滚动视图滚动时,我想在视图控制器中识别这一点,它是UIPageViewController
的父控件(添加为子)。
实现这一目标的最佳途径是什么?目前,我尝试将didScroll
委托回ContentUIViewController
的视图模型,然后将其输入到UIPageViewController
的父级,以调整想要折叠的标题高度,但它工作不太好/非常麻烦
是否有一种方法可以将子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)
}
发布于 2019-06-28 03:21:33
这是你如何让它发挥作用的方法。
1.在ContentUIViewController
中创建一个handler
,它将在scrollViewDidScroll(_:)
方法中为每个contentOffset
更改调用。
class ContentUIViewController: UIViewController, UIScrollViewDelegate {
var handler: ((CGPoint)->())?
func scrollViewDidScroll(_ scrollView: UIScrollView) {
handler?(scrollView.contentOffset)
}
}
2.在ParentVC
中创建一个UIPageViewController
实例,并将其作为child
添加到其中。我想你已经这么做了。
接下来需要做的是创建一个array
of ContentUIViewController
,并为每个实例设置我们前面创建的handler
。
每当在特定的handler
中滚动scrollView
时,都会调用这个ContentUIViewController
。我们会在这里得到contentOffset
of the scrollView
。用获得的contentOffset
调用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....
}
https://stackoverflow.com/questions/56804954
复制