给当UIPageViewController被滚动(用于图像的视差滚动)(Tell When a U

2019-09-01 08:10发布

我试图让类似于新的雅虎天气应用程序中的作用。 基本上,在每个页面UIPageViewController具有背景图像,并通过网页浏览滚动时,图像的位置只滚动大约一半的速度。 我会怎么做呢? 我以为我可以使用某种形式的委托方法在UIPageViewController得到当前偏移,然后更新这样的图像。 唯一的问题是,我无法找到反正告诉我们,如果UIPageViewController被滚动! 有没有一个方法是什么? 谢谢!

Answer 1:

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

这使您可以访问所有标准的滚动视图API方法。 这是不是使用私有API的苹果公司。

我通过添加子视图遍历,100%找到UIPageViewController的内滚动视图警告 :小心scrollview.contentOffset。 它重置作为控制器滚动到新页面

如果您需要persision scrollview偏移跟踪之类的东西,这将是更好地使用UICollectionViewController与大小为启用集合视图本身和寻呼细胞。



Answer 2:

我这样做:

Objective-C的

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

而实现此协议

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

迅速

for view in self.pageViewController.view.subviews {
  if let scrollView = view as? UIScrollView {
    scrollView.delegate = self
  }
}

而实现此协议

func scrollViewDidScroll(scrollView: UIScrollView)


Answer 3:

我的猜测是,它是不是一个UIPageViewController,而是一个分页的UIScrollView。 该UIScrollView中确实给你跟踪正在发生什么的滚动发生一个不断反复的委托方法。

或者,您可能能够访问分页的UIScrollView的UIPageViewController正在秘密使用的,但你可能会打破一些东西,我不知道苹果会感觉如何。



Answer 4:

使用@保罗的片段 -

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

要实现此协议: -(void)scrollViewDidScroll:(UIScrollView *)scrollView

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGPoint point = scrollView.contentOffset;

float percentComplete;
percentComplete = fabs(point.x - self.view.frame.size.width)/self.view.frame.size.width;
NSLog(@"percentComplete: %f", percentComplete);
}

这使您可以滚动的完成百分比。 编码愉快!



Answer 5:

extension UIPageViewController {

    var scrollView: UIScrollView? {

        return view.subviews.filter { $0 is UIScrollView }.first as? UIScrollView
    }
}

使用:

pageController.scrollView?.delegate = self


Answer 6:

在斯威夫特3,你可以把它写更短:

if let scrollView = self.pageViewController.view.subviews.first(where: { $0 is UIScrollView }) as? UIScrollView {
    scrollView.delegate = self
}


Answer 7:

你所寻找被称为视差滚动,你可以找到几个库,可以帮你。

编辑:马特是正确的,这不是一个答案,只是一个提示。 无论如何,让我们完成它:

对于动画奠定你的UIPageViewController你应该使用委托方法,它提供了后面的背景图像:

-[id<UIPageViewControllerDelegate> pageViewController:willTransitionToViewControllers:]
-[id<UIPageViewControllerDelegate> pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:]

这两种方法可以计算出滚动的百分比(你应该保存你的控制器阵列中知道在哪个控制器滚动到并获得百分比)



文章来源: Tell When a UIPageViewController is Scrolling (for Parallax Scrolling of an Image)