Вы можете реализовать простой протокол и использовать его для вашего просмотра:
protocol PresentedAsPush {
func presentLikeAPush()
}
extension UIView: PresentedAsPush {
func presentLikeAPush() {
self.frame = CGRect(x: bounds.width, y: 0, width: bounds.width, height: bounds.height)
UIView.animate(withDuration: 5) { [weak self] in // configure slide animation duration, and handler, if you need
guard let wrappedSelf = self else { return }
wrappedSelf.frame = CGRect(x: 0, y: 0, width: wrappedSelf.bounds.width, height: wrappedSelf.bounds.height)
}
}
}
Код нажатия:
func pushView() {
let blueView = UIView(frame: view.bounds)
blueView.backgroundColor = UIColor.blue
view.addSubview(blueView)
blueView.presentLikeAPush()
}
В вашем случае вы просто используете:
toController.view.presentLikeAPush()
Также вы можете реализовать обработчик для presentLikeAPushMethod, вернуть в нем блок завершения анимации и делать все, что вам нужно после анимации (удалить старый контроллер и т. Д.)
Также вы можете использовать ограничения вместо фрейма.
Добавление полного кода:
class RootViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.green
let redVc = RedViewController()
addChild(redVc)
view.addSubview(redVc.view)
}
}
class RedViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.red
let pushButton = UIButton()
view.addSubview(pushButton)
pushButton.setTitle("push", for: .normal)
pushButton.frame = CGRect(x: 20, y: 100, width: 100, height: 50)
pushButton.addTarget(self, action: #selector(pushButtonPressed), for: .touchUpInside)
}
@objc private func pushButtonPressed() {
guard let parent = parent else { return }
let blueVc = BlueViewController()
parent.addChild(blueVc)
parent.view.addSubview(blueVc.view)
blueVc.view.presentLikeAPush(fromController: self)
}
}
class BlueViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor.blue
}
}
protocol PresentedAsPush {
func presentLikeAPush(fromController: UIViewController)
}
extension UIView: PresentedAsPush {
func presentLikeAPush(fromController: UIViewController) {
self.frame = CGRect(x: bounds.width, y: 0, width: bounds.width, height: bounds.height)
UIView.animate(withDuration: 2, animations: { [weak self] in
guard let wrappedSelf = self else { return }
wrappedSelf.frame = CGRect(x: 0, y: 0, width: wrappedSelf.bounds.width, height: wrappedSelf.bounds.height)
}) { (completed) in
fromController.view.removeFromSuperview()
fromController.removeFromParent()
fromController.willMove(toParent: nil)
}
}
}