如何将显示模式视图( MV )的UIViewController( VC )推入一个带有从左到右过渡动画的屏幕上?
我尝试过:
设置MV的模式过渡样式,然后将两个控制器都添加到导航控制器的viewControllers
中。但是,这导致MV只是像堆栈中的其他任何控制器一样被淘汰的控制器。
我尝试不使用动画从VC呈现MV,然后将VC添加到viewControllers
并如上所述显示堆栈。这导致在开始向VC过渡时立即显示MV,而VC本身会按预期动画显示。例如。 MV滑入时不会跟随VC。
我尝试过从启用了动画的VC中呈现MV,但这会导致两个过渡:首先是VC动画到屏幕,然后VC向上滑动。
我没有主意,但是我想要一个原生而干净的解决方案:当VC完全覆盖了MV时,如何通过一次正常的从左到右的推动过渡到VC?
关键是MV和VC一起动画; MV的外观和行为类似于全屏子视图,但是在关闭时,它会像其他任何模式视图控制器一样在屏幕外进行动画处理。
答案 0 :(得分:0)
有许多解决此问题的方法。我认为UIPresentationController可以在这里提供重要线索。
我在这里尝试使答案尽可能简单。您可以根据需要更改参数,甚至可以更改UIPresentationController的子类来获得完整的动画。
import UIKit
//Green
class TransViewController: UIViewController {
// MARK: - Navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
let dest = segue.destination
let nextVC = storyboard?.instantiateViewController(withIdentifier: "modelViewController")
if let myPresenter = dest.presentationController{
myPresenter.presentedView!.addSubview(nextVC!.view)
nextVC!.view.center = CGPoint.init(x: nextVC!.view.center.x + nextVC!.view.frame.width , y: nextVC!.view.center.y)
UIView.animate(withDuration: 0.5, animations: {
nextVC!.view.center = self.view.center
}) { (success) in
dest.present(nextVC!, animated: false, completion: nil)
}
}
}
}
//Yellow ; "modelViewController"
class ModelViewController: UIViewController {
@IBAction func click(_ sender : UIButton){
self.dismiss(animated: true, completion: nil)
}
}