Я создаю приложение с пользовательским интерфейсом, похожим на 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
.