告诉UIPageViewController滚动时(用于图像的视差滚动)

Kei*_*ter 29 objective-c uiscrollview uiimage uipageviewcontroller

我试图产生类似于新雅虎天气应用程序中的效果.基本上,每个页面UIPageViewController都有一个背景图像,当滚动浏览页面视图时,图像的位置只滚动大约一半的速度.我该怎么办?我以为我可以使用某种委托方法UIPageViewController获取当前偏移量,然后像这样更新图像.唯一的问题是我无论如何都无法判断是否UIPageViewController正在滚动!有没有办法呢?谢谢!

Pav*_*rov 48

for (UIView *view in self.pageViewController.view.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
         [(UIScrollView *)view setDelegate:self];
    }
} 
Run Code Online (Sandbox Code Playgroud)

这使您可以访问所有标准滚动视图API方法.这不是使用私有Apple API.

我添加遍历子视图,100%找到UIPageViewController内部滚动视图 警告:小心scrollview.contentOffset.当控制器滚动到新页面时,它会重置

如果你需要透视scrollview偏移跟踪和类似的东西,最好使用一个UICollectionViewController大小为单元格的集合视图本身并启用分页.

  • 如果Apple改变了他们的页面视图控制器的架构,那你就搞砸了. (10认同)
  • 这个问题是它没有为scrollview.contentOffset提供标准结果.它会在每个新页面重置. (6认同)
  • 它不仅仅是关于Apple的chnages,而且你指定了新的委托,所以如果UIPageViewController的内部实现使用它,你就会破坏它. (4认同)
  • 这不是我的第一个子视图,而是第二个.这段代码做到了:`if([self.pageVC.view.subviews [1] respondsToSelector:@selector(setDelegate :))){[self.pageVC.view.subviews [1] setDelegate:self]; }` (3认同)

Van*_*ran 15

我会这样做:

Objective-C的

for (UIView *v in self.pageViewController.view.subviews) {
    if ([v isKindOfClass:[UIScrollView class]]) {
        ((UIScrollView *)v).delegate = self;
    }
}
Run Code Online (Sandbox Code Playgroud)

并实施此协议

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
Run Code Online (Sandbox Code Playgroud)

迅速

for view in self.pageViewController.view.subviews {
  if let scrollView = view as? UIScrollView {
    scrollView.delegate = self
  }
}
Run Code Online (Sandbox Code Playgroud)

并实施此协议

func scrollViewDidScroll(scrollView: UIScrollView)
Run Code Online (Sandbox Code Playgroud)