【发布时间】:2019-08-15 03:57:13
【问题描述】:
我正在创建一个用户界面类似于 Tinder 的应用。
我的意思是,可以在三个主要视图控制器之间“平移”。用户只需拖动即可移动到三个视图控制器中的任何一个。
我在我的应用中实现了类似的东西,但有一个重要的警告:它使用 swipe 手势识别器,而不是 pan 手势识别器。
最终结果看起来和感觉都很不自然。
这就是我希望我的用户界面的行为方式(忽略 Gecko):
请注意,使用 Tinder,您可以平移到新的视图控制器,而无需完全提交 segue。并且,如果平移没有将当前视图控制器移位超过最小阈值,它将简单地重新定位。这是我正在寻找的行为。
这是我目前用来模拟滑动手势识别器的一些代码:
//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 的导航栏。
【问题讨论】:
-
这是一个 UIPageViewController
标签: ios swift uipangesturerecognizer uiswipegesturerecognizer