Получить положение прокрутки UIPageViewController

Я использую UIPageViewController, и мне нужно получить позицию прокрутки ViewController при проглатывании пользователей, чтобы я мог частично исчезать некоторые активы, пока представление переходит к следующему UIViewController.

Методы делегата и datasource для UIPageViewController, похоже, не предоставляют никакого доступа к этому, и внутренне я предполагаю, что UIPageViewController должен использовать вид прокрутки где-то, но он не кажется прямым подкласс, поэтому я не могу позвонить

func scrollViewDidScroll(scrollView: UIScrollView) {

}

Я видел предложения некоторых других публикаций, чтобы получить ссылку на pageViewController!.view.subviews, а затем первым индексом является scrollView, но это кажется очень взломанным. Мне интересно, есть ли более стандартный способ справиться с этим.

Ответ 1

Вы можете искать UIScrollView внутри своего UIPageViewController. Для этого вам нужно будет выполнить UIScrollViewDelegate.

После этого вы можете получить свой scrollView:

for v in pageViewController.view.subviews{
    if v.isKindOfClass(UIScrollView){
        (v as UIScrollView).delegate = self
    }
}

После этого вы можете использовать все UIScrollViewDelegate-методы, и поэтому вы можете переопределить метод scrollViewDidScroll, где вы можете получить scrollPosition:

func scrollViewDidScroll(scrollView: UIScrollView) {
   //your Code
}

Или если вы хотите однострочный:

let scrollView = view.subviews.filter { $0 is UIScrollView }.first as! UIScrollView
scrollView.delegate = self

Ответ 2

Похож на христианский ответ, но немного более похожий на Swift (и не излишне продолжая цикл через view.subviews):

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

Ответ 3

Прокрутка UIPageViewController не работает, как обычное scrollview, и вы не можете получить scrollView.contentOffset, как и другие scrollView.

так что вот трюк, чтобы узнать, что происходит, когда пользователь прокручивает:

сначала вы должны найти 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
    }

}