检测 page/completion 动画到 UIPageViewController 中另一个页面的变化

Detect change in page/completion of animation to another page in UIPageViewController

我有以下功能,每当用户从一页滑动到另一页(垂直分页)时我想调用它:

func sendNotification (){

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

}

目前,可以说,每当创建 pageAfter 或 -before 时都会调用该函数。用于 "create" next/previous 页面的函数如下所示(在本例中为 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

}

由于 UIPageViewController 在某种程度上准备了以下页面并且返回到上一页也不会调用该函数(因为视图控制器不需要 "created")我没有得到我的结果想。我想知道是否有一个函数可以在动画完成时调用 sendNotification()。我发现了很多关于跳转到另一页的问题,但是 none 关于我的问题。非常感谢您的帮助!

也许运行 UIPageViewControllerDelegate 方法文档中的通知方法对您有好处 documentation :

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

您可以使用 UIPageViewControllerDelegate 函数

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

正如这些函数的名称所示,当用户滑动到您主页的另一页时,将调用第一个函数ViewController。

第二个将在 Transition 完成时调用,这意味着用户看到动画后的下一页。

在这两种情况下,您都可以检查页面之间的变化。

另外不要忘记检查第二个函数的 completed 变量。如果用户开始滑动然后没有转到下一页(因为他在它之前松开手指或类似的)这是错误的并且你没有新的 ViewController.

数组 previousViewControllers 包含最近显示的控制器,其中 previousViewControllers[0] 可能是之前显示的控制器。

有关更多信息,请查找 documentation