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!
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.
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)
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!
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.
extension UIPageViewController {
var scrollView: UIScrollView? {
return view.subviews.filter { $0 is UIScrollView }.first as? UIScrollView
}
}
En utilisant:
pageController.scrollView?.delegate = self
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
}
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)