以编程方式滚动UIPageViewController只是一点点

时间:2015-02-22 19:47:53

标签: ios

我有一个带3个屏幕的UIPageViewController。当用户首次打开应用程序时,我想以编程方式向右滚动一点,以显示他能够向左和向右滚动,并显示下一个屏幕的一部分。这可能吗?

我真正想做的是实施"反弹"首次加载应用时会产生影响,但首先我需要知道是否可以滚动页面控制器。

3 个答案:

答案 0 :(得分:5)

这实际上是可能的。

首先,您需要访问UIPageViewController滚动视图。在页面视图控制器子类中:

var scrollView: UIScrollView?

override func viewDidLoad() {
    super.viewDidLoad()

    self.setupScrollView()
}

private func setupScrollView() {
    for view in self.view.subviews{
        if let scrollView = view as? UIScrollView {
            self.scrollView = scrollView
            self.scrollView?.delegate = self // if needed
        }
    }
}

当您准备好显示滚动提示时,请调整滚动视图的内容偏移量。请记住,您的初始滚动偏移量可能不为零。即使您在第一页,也有页面概念和页面之后。在我的例子中,我的初始偏移量是屏幕的宽度。这是一个示例滚动提示:

self.view.userInteractionEnabled = false         

UIView.animateWithDuration(0.3,
    animations: { () -> Void in

        if let pvc = self.pageViewController as? HomePageViewController {
            if let currentXOffset: CGFloat = pvc.scrollView?.contentOffset.x {
                pvc.scrollView?.setContentOffset(CGPointMake(currentXOffset + 40, 0), animated: false)
            }
        }
}, completion: { (finished) in

    UIView.animateWithDuration(0.5,
        delay: 0.3,
        usingSpringWithDamping: 0.3,
        initialSpringVelocity: 0.6,
        options: .allZeros,
        animations: { () -> Void in

            if let pvc = self.pageViewController as? HomePageViewController {
                if let currentXOffset: CGFloat = pvc.scrollView?.contentOffset.x {
                    pvc.scrollView?.setContentOffset(CGPointMake(currentXOffset - 40, 0), animated: false)
                }
            }
     }, completion: { (finished) -> Void in
         self.view.userInteractionEnabled = true
     })

答案 1 :(得分:0)

以防将来有人看到它,我有一个更简单的方法,但是它也不会在另一个viewController上显示内容。我要做的就是使用原始cgPoint并将其移到PageVC的ViewController之一中:

UIView.animate(withDuration: 0.4, animations: {
                self.view.frame.origin.x += 50
            }) { (_) in
                UIView.animate(withDuration: 0.4, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: .curveEaseOut, animations: {
                    self.view.frame.origin.x -= 50
                }) { (_) in
                    // Do something when it is finished
                }
            }

答案 2 :(得分:-1)

没有。不可能。

UIPageViewController仅允许通过- (void)setViewControllers:(NSArray *)viewControllers direction:(UIPageViewControllerNavigationDirection)direction animated:(BOOL)animated completion:(void (^)(BOOL finished))completion

更改原子页面

要做你想做的事情,你可以通过构建一个简单的左/右转换来利用UIPercentDrivenInteractiveTransition,以编程方式将其分流,然后取消。

如果您不熟悉课程,您将能够找到UIPercentDrivenInteractiveTransition的教程。