web-dev-qa-db-fra.com

Dire quand un UIPageViewController défile (pour le défilement Parallax d'une image)

J'essaie de faire un effet similaire à celui trouvé dans la nouvelle application météo Yahoo. Fondamentalement, chaque page dans le UIPageViewController a une image d'arrière-plan, et lorsque vous faites défiler la vue de la page, l'emplacement de l'image défile seulement environ la moitié de la vitesse. Comment ferais-je ça? J'ai pensé que je pouvais utiliser une sorte de méthode déléguée dans le UIPageViewController pour obtenir le décalage actuel, puis mettre à jour les images comme ça. Le seul problème est que je ne peux pas trouver de toute façon si le UIPageViewController défile! Existe-t-il une méthode pour cela? Merci!

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

cela vous donne accès à toutes les méthodes d'API de défilement standard. Et cela n'utilise pas privé Apple API.

J'ai ajouté traversant les sous-vues pour trouver à 100% la vue de défilement interne de UIPageViewController AVERTISSEMENT : Soyez prudent avec scrollview.contentOffset. Il se réinitialise lorsque le contrôleur fait défiler vers de nouvelles pages

Si vous avez besoin d'un suivi de décalage _ persistance scrollview et d'autres choses de ce genre, il serait préférable d'utiliser un UICollectionViewController avec des cellules de la taille de la vue de la collection elle-même et de la pagination activée.

48
Pavel Gurov

Je ferais ceci:

Objectif-C

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

et implémenter ce protocole

- (void)scrollViewDidScroll:(UIScrollView *)scrollView

rapide

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

et implémenter ce protocole

func scrollViewDidScroll(scrollView: UIScrollView)
15
Van Du Tran

Utilisez l'extrait de @ Paul -

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

pour implémenter ce protocole: -(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);
}

Cela vous donne le pourcentage d'achèvement du défilement. Bon codage!

3
genaks

Je suppose que c'est pas un UIPageViewController, mais plutôt un UIScrollView paginé. UIScrollView fait vous donne une méthode déléguée constamment répétée qui suit ce qui se passe pendant le défilement.

Alternativement, vous pourriez être en mesure d'accéder à l'UIScrollView paginé que l'UIPageViewController utilise secrètement, mais vous pourriez casser quelque chose, et je ne sais pas comment Apple se sentirait à propos de ça.

3
matt
extension UIPageViewController {

    var scrollView: UIScrollView? {

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

En utilisant:

pageController.scrollView?.delegate = self
2
Mike Glukhov

Dans Swift 3 vous pourriez l'écrire encore plus court:

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

Ce que vous recherchez s'appelle le défilement de parallaxe, vous pouvez trouver plusieurs bibliothèques qui peuvent vous aider avec cela.

Edit: Matt a raison, ce n'est pas une réponse, seulement un indice. Quoi qu'il en soit, complétons-le:

Pour animer une image d'arrière-plan qui se cache derrière votre UIPageViewController, vous devez utiliser les méthodes déléguées qu'il propose:

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

Avec ces deux méthodes, vous pouvez calculer le pourcentage de défilement (vous devez stocker vos contrôleurs dans votre baie pour savoir à quel contrôleur vous avez fait défiler et obtenir le pourcentage)

0
Antonio E.