2017-06-16 3 views
0

I ont la fonction suivante qui je voudrais appeler à chaque fois que l'utilisateur fait glisser d'une page à l'autre (paging vertical):détecter les changements dans la page/achèvement d'animation vers une autre page dans UIPageViewController

func sendNotification(){ 

    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "stopVideo"), object: nil) 
    print("called") 

} 

Actuellement, la fonction est appelée chaque fois que la pageAfter ou -avant est créée pour ainsi dire. La fonction utilisée pour « créer » la page suivante/précédente ressemble à ceci (dans ce cas, il est viewControllerAfter):

func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 

    let currentIndexString = (viewController as! MyViewController).index 
    let currentIndex  = indec.index(of: currentIndexString!) 

    //set if so that next page 
    if currentIndex! < indec.count - 1 { 

     let myViewController = MyViewController() 

     myViewController.index   = indec[currentIndex! + 1] 

     sendNotification() //function is called 

     return myViewController 

    } 

    return nil 

} 

Depuis le UIPageViewController prépare un peu les pages suivantes et retourner à la page précédente également ne remet pas la fonction (comme le contrôleur de vue n'a pas besoin d'être "créé") je n'obtiens pas le résultat que je veux. Je me demandais s'il y a une fonction dans laquelle je peux appeler sendNotification() à la fin de l'animation. J'ai trouvé beaucoup de questions concernant le saut à une autre page mais aucune concernant mon problème. J'apprécierais vraiment votre aide!

Répondre

3

Vous pouvez utiliser les UIPageViewControllerDelegate Fonctions

func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) 
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) 

Comme le nom de ces fonctions dites, le premier sera appelé, lorsque l'utilisateur glisse vers une autre page de votre PageViewController.

Le second sera appelé, lorsque la transition sera terminée, ce qui signifie que l'utilisateur verra la page suivante après l'animation.

Dans les deux vous pouvez vérifier les changements entre les pages.

N'oubliez pas non plus de vérifier la variable completed de la deuxième fonction. Si l'utilisateur commence à glisser et ne va pas à la page suivante (parce qu'il libère le doigt avant cela ou similaire), il est faux et vous n'avez pas votre nouveau ViewController.

Le tableau previousViewControllers contient les contrôleurs récemment affichés où previousViewControllers[0] est probablement celui affiché précédemment.

Pour plus d'informations consulter le documentation

+0

Je suis encore à apprendre rapidement et pas tout à fait sûr que je qualifierais ma fonction à l'intérieur ... J'ai ajouté à 'UIPageViewControllerDelegate' à mes types de classe et ai essayé de mettre simplement ma fonction à l'intérieur de la deuxième fonction, mais cela ne fonctionne pas ... – Moritz

+0

pourriez-vous mettre à jour votre question et montrer l'utilisation de la méthode de délégué? –

+0

Trouvé mon erreur, j'ai oublié de 'delegate = self' ... ♂️ merci! – Moritz

1

Peut-être que ce sera bon pour vous d'exécuter votre méthode de notification UIPageViewControllerDelegate documentation de la méthode documentation:

optional func pageViewController(_ pageViewController: UIPageViewController, 
       didFinishAnimating finished: Bool, 
     previousViewControllers: [UIViewController], 
      transitionCompleted completed: Bool)