Я пытаюсь сделать эффект, похожий на тот, который найден в новом приложении Yahoo Weather. В основном, каждая страница в UIPageViewController
имеет фоновое изображение, а при прокрутке просмотра страницы местоположение изображения только прокручивает примерно половину скорости. Как мне это сделать? Я подумал, что могу использовать какой-то метод делегата в UIPageViewController
, чтобы получить текущее смещение, а затем обновить такие изображения. Единственная проблема заключается в том, что я никак не могу найти, прокручивается ли UIPageViewController
! Есть ли способ для этого? Спасибо!
Сообщите, когда прокрутка UIPageViewController (для прокрутки изображения Parallax)
Ответ 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