Подтвердить что ты не робот

UIPageViewController vs UIViewControllerInteractiveTransitioning

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

Я ищу поведение, аналогичное тому, что предоставляет UIPageViewController (не связанная с стеком перемотка вперед и назад через "страницы" содержимого). Но я хочу иметь возможность настраивать переходы, и я хочу, чтобы переходы были интерактивными, связанными с пользовательским UIPanGestureRecognizer.

Кажется, что протокол UIViewControllerInteractiveTransitioning предоставляет некоторые из того, что я хочу (интерактивность, пользовательские переходы). Но поскольку переходы вызывают только с помощью presentViewController:animated: и dismissViewControllerAnimated:, похоже, он создан исключительно для использования с навигацией на основе стека (т.е. UINavigationController, UITabBarController, модальное представление). То есть не похоже, что он будет хорошо играть с чем-то вроде UIPageViewController.

Если я использую UIViewController сдерживание для создания пользовательского контейнера, аналогичного UIPageViewController (см. демонстрацию demo здесь), я могу интегрировать UIViewControllerInteractiveTransitioning в этом, чтобы управлять переходами? Или мне нужно катить их самостоятельно (в настоящее время у меня есть грубая ручная реализация интерактивных переходов)?

4b9b3361

Ответ 1

Я делаю много настраиваемых анимаций в своих приложениях, которые большинство разработчиков уклоняются от этого, потому что я использую много ограничений UIViewControlloer в моей работе.

Это самый простой способ получить переходы, которые вы ищете.

Вот как бы я это сделал:

  • Создайте контроллер базового представления; позволяет называть его MainViewController. Он будет иметь ссылки на все остальные контроллеры представлений и содержать логику переходов. Он также должен следовать протоколу, который мы будем определять как ViewXControllerDelegate.

  • Создайте свои другие контроллеры представлений; позволяет называть их View1Controller, View2Controller, View3Controller. Добавьте экземпляр каждого из них как частные свойства MainViewController. В методе init MainViewController создайте экземпляры и добавьте их представления в виде представлений MainViewController. Должен выглядеть примерно так:

    self.v1c = [[View1Controller alloc]init];
    [self addChildViewController:self.v1c];
    [self.v1c didMoveToParentViewController:self];
    
    //Setup each subview so that its frame makes it off screen or
    //On screen depending on the app state and where you want each
    //subview to animate to/from
    
    [self.view addSubview:self.v1c.view];
    
    ....
    
  • Создайте идентификатор пользователя UIPanGestureRecognizer в каждом из ваших ViewXControllers, у которого его целевая и селекторная установки установлены на родительский контроллер представления (MainViewController).

  • Управляйте всей логикой в ​​классе MainViewController, где вы учитываете пройденное расстояние, состояние приложения, местоположения каждого из представлений (используя вспомогательные свойства в ViewXControllers, такие как "inactiveFrame" или "activeFrame", где анимация между ними происходит на основе процента движения, которое произошло в жесте pan.