UIPageViewController 委托方法类似于 scrollViewDidScroll:(UIScrollview*)scrollview
Posted
技术标签:
【中文标题】UIPageViewController 委托方法类似于 scrollViewDidScroll:(UIScrollview*)scrollview【英文标题】:UIPageViewController delegate method similar to scrollViewDidScroll:(UIScrollview*)scrollview 【发布时间】:2014-09-22 21:01:22 【问题描述】:我正在使用 UIPageViewController 浏览一系列视图控制器。我希望父视图控制器的背景在滑动时根据视图之间的滚动位置在颜色之间平滑过渡。我希望 UIPageViewController 会有一个类似于 scrollViewDidScroll 的委托方法,但它似乎没有。
是否有替代方法或类似方法可以在滑动发生/更改时显示其位置?
编辑: 由于滚动视图似乎没有暴露,我想出了一个烫发/临时解决方案。在页面之间转换时,我将父背景颜色转换为 1 秒的动画。这不会直接与滑动相关联,也不允许半滑动等。但是对于常规的左右滑动,它可以实现所需的平滑效果,而不是即时颜色变化。
// code that occurs when a pageControl swipe occurs.
UIColor *destinationColor = [UIColor redColor]; // the desired end color
[UIView animateWithDuration:1.0
delay:0
options:UIViewAnimationOptionAllowUserInteraction
animations:^
self.pageViewController.view.backgroundColor = destinationColor;
completion:nil
];
【问题讨论】:
您的最低部署目标是什么? ios 7 及更高版本? ios7 最低。我们不支持 ios6。 不幸的是,当您使用滚动转换时,您无法访问添加到页面视图控制器的子视图中的滚动视图(Apple 尚未公开)。如果需要该功能,您必须创建自己的页面视图控制器版本。 【参考方案1】:虽然UIPageViewController
的UIScrollView
默认情况下不会公开,但实际上并不难找到,因此您可以通过将视图控制器设置为UIScrollViewDelegate
来做您想做的事情,然后执行类似的操作在viewDidLoad
方法等中:
for (UIView *view in pageViewController.view.subviews)
if ([view isKindOfClass:[UIScrollView class]])
((UIScrollView *)view).delegate = self;
break;
现在您的视图控制器可以实现scrollViewDidScroll:
并能够跟踪页面视图控制器的转换。
【讨论】:
谢谢!对于任何感到懒惰的人,这里是 swift 版本:for view in pageViewController.view.subviews if let view = view as? UIScrollView view.delegate = self 【参考方案2】:如果您的意思是希望两个视图控制器之间的转换在用户滑动时跟踪用户的手指,那么设置数据源并实现方法:viewControllerBeforeController
和 viewControllerAfterController
。如果实现了这些,UIPageViewController 将自动实现一个手势识别器,该手势识别器跟踪用户的滑动并相应地为两个 viewController 之间的过渡设置动画。
【讨论】:
视图转换已通过此方法到位。我想实际跟踪滑动位置,这样我就可以在滑动中的任何一点告诉它有多远,如果它们来回移动等等。以上是关于UIPageViewController 委托方法类似于 scrollViewDidScroll:(UIScrollview*)scrollview的主要内容,如果未能解决你的问题,请参考以下文章
在 UIPageViewController 中包含的 ViewController 的委托获得 nil
如何设置 UIPageViewController(分页类型)手势委托
UIPageViewController 委托、数据源和接口错误