Подтвердить что ты не робот

Сообщите, когда прокрутка UIPageViewController (для прокрутки изображения Parallax)

Я пытаюсь сделать эффект, похожий на тот, который найден в новом приложении Yahoo Weather. В основном, каждая страница в UIPageViewController имеет фоновое изображение, а при прокрутке просмотра страницы местоположение изображения только прокручивает примерно половину скорости. Как мне это сделать? Я подумал, что могу использовать какой-то метод делегата в UIPageViewController, чтобы получить текущее смещение, а затем обновить такие изображения. Единственная проблема заключается в том, что я никак не могу найти, прокручивается ли UIPageViewController! Есть ли способ для этого? Спасибо!

4b9b3361

Ответ 1

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

это дает вам доступ ко всем стандартным API-интерфейсам прокрутки. И это не использует частные API Apple.

Я добавил прохождение через subviews, чтобы 100% найти внутренний просмотр прокрутки UIPageViewController Внимание: Будьте осторожны с scrollview.contentOffset. Он сбрасывается, когда контроллер прокручивается на новые страницы

Если вам нужно отслеживать смещение scrollview и т.д., было бы лучше использовать UICollectionViewController с ячейками, размер которых будет отображаться сам по себе и подкачкой.

Ответ 2

Я бы сделал это:

Objective-C

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

и реализовать этот протокол

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

Swift

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

и реализовать этот протокол

func scrollViewDidScroll(scrollView: UIScrollView)

Ответ 3

Моя догадка заключается в том, что это не UIPageViewController, а скорее страничный UIScrollView. UIScrollView дает вам постоянно повторяющийся метод делегата, который отслеживает, что происходит при прокрутке.

В качестве альтернативы вы можете получить доступ к выгружаемому UIScrollView, который UIPageViewController тайно использует, но вы можете что-то сломать, и я не уверен, как Apple будет чувствовать это.

Ответ 4

Использовать фрагмент @Paul -

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);
}

Это дает вам процентное завершение прокрутки. Счастливое кодирование!

Ответ 5

То, что вы ищете, называется прокруткой параллакса, вы можете найти несколько библиотек, которые могут вам помочь.

Изменить: Мэтт прав, это не ответ, только намек. В любом случае, дополним это:

Для анимации фонового изображения, лежащего за вашим UIPageViewController, вы должны использовать методы делегата, которые он предлагает:

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

С помощью этих двух методов вы можете рассчитать процент прокрутки (вы должны хранить свои контроллеры в своем массиве, чтобы узнать, на каком контроллере вы прокрутили и получить процент)

Ответ 6

В Swift 3 вы можете записать его еще короче:

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

Ответ 7

extension UIPageViewController {

    var scrollView: UIScrollView? {

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

Использование:

pageController.scrollView?.delegate = self