Панорамирование (не смахивание) между контроллерами просмотра

Я создаю приложение с пользовательским интерфейсом, похожим на Tinder.

Под этим я подразумеваю, что есть три основных контроллера представления, между которыми можно «панорамировать». Пользователь может просто перетащить, чтобы перейти к любому из трех контроллеров представления.

Я реализовал нечто подобное в своем приложении с одной важной оговоркой: оно использует распознаватели жестов смахивания, а не распознаватели жестов панорамирования.

Конечный результат выглядит и ощущается очень неестественным.

Вот как я бы хотел, чтобы мой пользовательский интерфейс вел себя (игнорируйте Gecko):

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

Вот как он в настоящее время ведет себя с распознавателем жестов смахивания:  введите описание изображения здесь

Обратите внимание, как с помощью Tinder вы можете перемещаться к новому контроллеру представления, не выполняя полностью переход. И, если панорамирование не сместило текущий контроллер представления за пределы минимального порога, он просто вернется на место. Это то поведение, которое я ищу.

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

//The following logic is applied in a similar way to view controllers 1 and 3 as well.

class ViewController2: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        addSwipeGestureRecognizers()
    }

    func addSwipeGestureRecognizers() {
        let swipeLeft = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipeLeft))
        swipeLeft.direction = UISwipeGestureRecognizer.Direction.left
        self.view.addGestureRecognizer(swipeLeft)

        let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(handleSwipeRight))
        swipeRight.direction = UISwipeGestureRecognizer.Direction.right
        self.view.addGestureRecognizer(swipeRight)
    }

    @objc func handleSwipeLeft() {
        let storyboard = UIStoryboard(name: "Main", bundle: .main)
        let viewController1 = storyboard.instantiateViewController(withIdentifier: "ViewController1") as! ViewController1
        let transition:CATransition = CATransition()
        transition.duration = 0.25
        transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
        transition.type = CATransitionType.push
        transition.subtype = CATransitionSubtype.fromLeft
        self.navigationController!.view.layer.add(transition, forKey: kCATransition)
        navigationController!.pushViewController(viewController1, animated: false)
    }

    @objc func handleSwipeRight() {
        let storyboard = UIStoryboard(name: "Main", bundle: .main)
        let viewController3 = storyboard.instantiateViewController(withIdentifier: "ViewController3") as! ViewController3
        let transition:CATransition = CATransition()
        transition.duration = 0.25
        transition.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
        transition.type = CATransitionType.push
        transition.subtype = CATransitionSubtype.fromRight
        self.navigationController!.view.layer.add(transition, forKey: kCATransition)
        navigationController!.pushViewController(viewController3, animated: false)
    }
}

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


person David Chopin    schedule 15.08.2019    source источник
comment
Это UIPageViewController   -  person Fogmeister    schedule 15.08.2019


Ответы (2)


Я не уверен, что UINavigationController - это правильный контейнерный контроллер, чтобы предоставить то, что вам нужно. Вы можете обнаружить, что UIPageViewController - лучший выбор, я думаю, он обеспечит естественный жест смахивания, который вы ищете из коробки, хотя это довольно непрозрачный класс с некоторыми собственными причудами.

Чтобы перейти по индивидуальному маршруту (либо с помощью UINavigationController, либо с более гибкой / настраиваемой пользовательской презентацией UIViewController), вы на правильном пути с UIViewControllerAnimatedTransitioning и другими (многочисленными) связанными протоколами. Если вы торопитесь, реализация этого маршрута займет у вас довольно много времени, поэтому, возможно, на данный момент вам понадобится простая реализация UIPageViewController.

person glotcha    schedule 15.08.2019
comment
Спасибо, завтра попробую опробовать контроллер просмотра страниц. На самом деле не думал об этом. Я вернусь к тому, как оно идет - person David Chopin; 15.08.2019
comment
Да, вот оно что. Потребовалось некоторое ознакомление с UIPageViewControllers, но это помогло мне. - person David Chopin; 15.08.2019

Этот проект на github может помочь вам в выполнении ваших требований - здесь

person Imran Malik    schedule 15.08.2019