Направление UIPageViewController только вперед

Цель состоит в том, чтобы создать UIPageViewController, который может перемещаться только вперед. Я использую источник данных для предоставления контента для UIPageViewController. Для направления задано значение UIPageViewControllerNavigationDirectionForward, стиль перехода — UIPageViewControllerTransitionStyleScroll.

Реализация

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    // returns the next view controller
}

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

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    return nil;
}

Возврат nil должен указывать на то, что навигация невозможна (как указано в документации). Тем не менее, я всегда могу прокрутить одну страницу назад. Допустим, у меня есть 10 страниц, я могу прокручивать вперед все страницы, но на любой странице я могу прокручивать 1 страницу назад. (Например: на странице 5 я могу вернуться на страницу 4, на странице 8 я могу вернуться на страницу 7 и так далее.)

Я знаю, что могу избежать этого, не используя источник данных и используя метод setViewControllers:direction:animated:completion:, но я хотел бы понять, почему моя попытка не удалась.


person mmvie    schedule 20.01.2013    source источник


Ответы (2)


Это поведение, которое вы получаете, когда ваш pageViewController имеет свой стиль перехода, установленный для прокрутки - я не уверен, почему, но это как-то связано с представлением прокрутки, вставленным где-то в иерархию (которое я мог бы увидеть, если бы я запускал мой проект с включенными инструментами). Если переход выполнен в виде скручивания страницы, то вы не отобразите предыдущую страницу, если вы вернете ноль там, где вы это делаете.

Итак, я думаю, вы застряли с использованием setViewControllers:direction:animated:completion: если вы не хотите переключиться на анимацию скручивания страницы.

person rdelmar    schedule 20.01.2013
comment
Спасибо. Использование PageCurl действительно работает. Поиск этого привел к нахождению этого отличного ответа: заголовок stackoverflow.com/questions/12939280/ - person mmvie; 20.01.2013
comment
@mmvie, я не уверен, почему Apple настроила его таким образом - я заметил, что при первом свайпе влево (в прямом направлении) вызывается viewControllerAfterViewController , затем viewControllerBeforeViewController , а затем снова viewControllerAfterViewController , если стиль настроен на прокрутку. Я предполагаю, что они делают это, чтобы добавить соответствующие контроллеры представления в представление прокрутки, чтобы вы могли видеть текущий, а также предыдущие и последующие при панорамировании. - person rdelmar; 20.01.2013
comment
Я тоже это заметил. Они действительно гарантируют, что следующий и предыдущий контроллеры представления всегда находятся в списке контроллеров представления pageViewController. Вероятно, чтобы избежать задержек, вызванных созданием представлений, и, следовательно, создать хороший пользовательский интерфейс. Мне интересно, является ли это ожидаемым поведением или нет, если направление установлено только вперед и при явном возврате nil в viewControllerBeforeViewController... - person mmvie; 21.01.2013
comment
@mmvie, я не знаю насчет ожидаемого. Это может быть непреднамеренным последствием загрузки прокрутки, но я бы не назвал это ошибкой. На самом деле нет режима «только вперед» — аргумент «прямой» или «обратный» для setViewControllers:direction:animated:completion: просто определяет, какую анимацию вы получите, если перейдете на определенную страницу — это не имеет ничего общего с направлением, в котором вы получить при свайпе. - person rdelmar; 21.01.2013

Вот простое решение: просто установите значение по умолчанию isLeftScrollEnabled в false в протоколе: uipageviewcontroller/58366298#58366298">UIPageViewController с настраиваемыми направлениями прокрутки

person michael-martinez    schedule 13.10.2019