Эффект перехода экрана с помощью UIView.animate - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть приложение с различными экранами.У меня есть следующая кнопка и предыдущая кнопка на каждом экране.При нажатии следующей кнопки я покажу свой следующий экран.Прямо сейчас я показываю свой следующий экран, используя UIView.animate (), который просто заменяет мой текущий экран следующим экраном.Он не дает / не производит никакого анимационного эффекта при переходе экрана.При нажатии следующей кнопки я хочу, чтобы следующий экран выглядел как приходящий / представленный с правой стороны.Как мне добиться такого эффекта перехода?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Вы можете реализовать простой протокол и использовать его для вашего просмотра:

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)
        }
    }
}
0 голосов
/ 23 сентября 2019

Вы можете использовать контроллер вида навигации и установить его в качестве начального контроллера вида для этой серии видов.

или

let newView  = sampleStoryBoard.instantiateViewController(withIdentifier: "NewViewController") as! NewViewController 

self.present(newView, animated: true, completion: nil)
...