UIPageViewController, где реализовать метод setViewControllers (.. :) - PullRequest
0 голосов
/ 24 февраля 2020

Итак, у меня есть UIPageViewController, в котором я хочу, чтобы spineLocation был .mid, если устройство находится в альбомной ориентации, и .min для портретной, поэтому отображаются два контроллера в альбомной и один в портретной ориентациях.

В делегат контроллера представления страницы Я реализовал эту функцию:

func pageViewController(_ pageViewController: UIPageViewController, spineLocationFor orientation: UIInterfaceOrientation) -> UIPageViewController.SpineLocation {
    if orientation == .landscapeLeft || orientation == .landscapeRight {
        return .mid
    } else {
        return .min
    }
}

В моем классе UIPageViewController для установки контроллеров представления у меня есть эта функция:

func setControllers() {
    var controllers: [UIViewController] = [controller1]
    if spineLocation == .mid {
        controllers.append(controller2)
    }
    setViewControllers(controllers, direction: .forward, animated: true, completion: nil)
}

Моя проблема в том, что я не уверен где его поместить, я попытался:

  1. viewDidLoad (перед настройкой делегата pageController)
  2. viewDidLoad (после настройки делегата pageController)
  3. viewWillTransition (для размера: CGSize, с координатором: UIViewControllerTransitionCoordinator)
  4. didRotate (из fromInterfaceOrientation: UIInterfaceOrientation)
  5. willRotate (toInterfaceOrientation: UIInterfaceOrientation, длительность: показано 1020 * * * 10 * 10 * * 10 * 10 *) правильно в портретном режиме, но когда я запускаю или поворачиваю устройство andscape приложение аварийно завершает работу для:

    *** Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «Количество предоставленных контроллеров представления (1) не соответствует требуемому числу (2) для запрошенного расположение позвоночника (UIPageViewControllerSpineLocationMid) '


1 Ответ

0 голосов
/ 24 февраля 2020

Я исправил это следующим образом: добавив spineLocation в качестве параметра для функции setControllers:

func setControllers(forSpineLocation location: SpineLocation) {
var controllers: [UIViewController] = [controller1]
if location == .mid {
    controllers.append(controller2)
}
setViewControllers(controllers, direction: .forward, animated: true, completion: nil)

}

И реализовав его как в viewDidLoad, так и в pageViewController (_ pageViewController: UIPageViewController, spineLocationДля ориентации: UIInterfaceOrientation):

override func viewDidLoad() {
    super.viewDidLoad()
    setControllers(withLocation: spineLocation)
}

func pageViewController(_ pageViewController: UIPageViewController, spineLocationFor orientation: UIInterfaceOrientation) -> UIPageViewController.SpineLocation {
    var location = SpineLocation.min
    if orientation == .landscapeLeft || orientation == .landscapeRight {
        location = .mid
    }
    setControllers(withLocation: location)
    return location
}

Я не знаю, является ли это правильным или лучшим способом сделать это, но это работает.

...