Программно переворачивает страницу, индикаторы не меняются

Я пробую следующий подход, найденный здесь

extension UIPageViewController {

func goToNextPage(){

    guard let currentViewController = self.viewControllers?.first else { return }

    guard let nextViewController = dataSource?.pageViewController( self, viewControllerAfter: currentViewController ) else { return }

    setViewControllers([nextViewController], direction: .forward, animated: true, completion: nil)

   }
}

Работает, но есть одна проблема:

При программном перелистывании страницы индикатор не двигается. Кажется, что они двигаются только тогда, когда пользователь поворачивается. страница со свайпом

вот как должны выглядеть индикаторы после выполнения программного поворота:

введите здесь описание изображения

вместо этого они остаются неизменными

введите здесь описание изображения

Что приводит к проблеме, что иерархия, показанная индикаторами, скорее [2,0,1], а не [0,1,2]

Вот как я реализую индикаторы:

func presentationCount(for PageViewController:UIPageViewController) -> Int {


    return 3

}

func presentationIndex(for PageViewController:UIPageViewController) -> Int {

    return 0
}

Как заставить индикаторы точек двигаться при перелистывании страницы программно?


person theDC    schedule 27.10.2016    source источник


Ответы (3)


К сожалению, вы не можете обновить UIPageControl, встроенный в UIPageViewController. Однако вы можете иметь свой собственный UIPageControl в UIPageViewController, чтобы получить полный контроль. Затем вы можете программно обновить свойство UIPageControl при обновлении страницы. Взгляните на эту статью.

person Muhammad Waqas Khalid    schedule 27.10.2016

Существует обходной путь: получите подвиды UIPageViewController, установите значение currentPage.

for subView in self.view.subviews{
     if let pageControl = subView as? UIPageControl,
         pageControl.numberOfPages >  currentIndex{
         pageControl.currentPage = currentIndex
     }
}
person Ramesh R C    schedule 04.03.2019

Вы можете, все, что вам нужно сделать, это сохранить индекс страницы в переменной, давайте назовем ее currentPageIndex и используйте следующий метод:


// Part of UIPageViewControllerDelegate 

func presentationIndex(for pageViewController: UIPageViewController) -> Int {
  return currentPageIndex;
}

// In your Button action, set this variable

@IBAction func nextPage(_ sender: Any) {
   var index = (pageViewController?.viewControllers?.last as! SinglePageViewController).pageIndex
   currentPageIndex = index
}

Вот и все!! Теперь индикатор вашей страницы должен работать. Я застрял в такой же ситуации, как у вас.

person nayan dhabarde    schedule 13.09.2019