获取UIPageViewController的滚动位置

Uno*_*ome 18 ios swift

我正在使用a UIPageViewController,我需要在用户滑动时获取ViewController的滚动位置,这样我可以在视图转换到下一个视图时部分淡化某些资源UIViewController.

委托和数据源方法UIPageViewController似乎没有提供对此的任何访问,并在内部我假设UIPageViewController必须在某处使用滚动视图,但它似乎没有直接子类化它所以我不能呼叫

func scrollViewDidScroll(scrollView: UIScrollView) {

}
Run Code Online (Sandbox Code Playgroud)

我已经看到一些其他帖子建议获取引用pageViewController!.view.subviews然后第一个索引是一个scrollView,但这似乎非常 hacky.我想知道是否有更标准的方法来处理这个问题.

Chr*_*örz 38

您可以在自己的内部搜索UIScrollView UIPageViewController.要做到这一点,你必须实现UIScrollViewDelegate.

之后你可以得到你的scrollView:

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

之后,您可以使用所有UIScrollViewDelegate方法,因此您可以覆盖scrollViewDidScroll可以获取scrollPosition的方法:

func scrollViewDidScroll(scrollView: UIScrollView) {
   //your Code
}
Run Code Online (Sandbox Code Playgroud)

或者如果你想要一个单行:

let scrollView = view.subviews.filter { $0 is UIScrollView }.first as! UIScrollView
scrollView.delegate = self
Run Code Online (Sandbox Code Playgroud)


jep*_*peb 9

类似于Christian的答案,但有点像Swift一样(并且没有不必要地继续遍历view.subviews):

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


Ash*_*rat 7

UIPageViewController滚动不能像普通的scrollview一样工作,并且您不能像其他scrollViews一样获得scrollView.contentOffset。

因此,这里有个技巧,可让用户了解滚动时发生的情况:

首先,您必须找到scrollview并将委托设置为当前的viewController,就像其他答案所说的那样。

class YourViewController : UIPageViewController {

    var startOffset = CGFloat(0) //define this

    override func viewDidLoad() {
         super.viewDidLoad()

         //from other answers   
         for v in view.subviews{
             if v is UIScrollView {
                 (v as! UIScrollView).delegate = self
             }
         }
     }

    .
    .
    .
}

extension YourViewController : UIScrollViewDelegate{

    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {

        startOffset = scrollView.contentOffset.x
    }

    public func scrollViewDidScroll(_ scrollView: UIScrollView) {

        var direction = 0 //scroll stopped

        if startOffset < scrollView.contentOffset.x {
            direction = 1 //going right
        }else if startOffset > scrollView.contentOffset.x {
            direction = -1 //going left
        }

        let positionFromStartOfCurrentPage = abs(startOffset - scrollView.contentOffset.x)
        let percent = positionFromStartOfCurrentPage /  self.view.frame.width

        //you can decide what to do with scroll
    }

}
Run Code Online (Sandbox Code Playgroud)