首页 > 解决方案 > 在 ViewController 之间转换时使用 UIView.transition 和 UIView.AnimationOptions 时出现动画问题

问题描述

我正在使用 Swift 并尝试使用以下代码在菜单屏幕视图控制器 (LaunchViewController) 和游戏视图控制器 (InGameViewController) 之间进行转换。然而,虽然过渡工作正常,但无论我使用什么动画选项(当前使用.transitionCrossDissolve),动画总是从左上角出现并展开以填满整个屏幕。我可以更改持续时间并按预期调整动画,但无论我使用什么 UIView.AnimationOption 总是使用相同的动画。

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "InGameViewController")
vc.view.frame = (self.view?.frame)!
vc.view.layoutIfNeeded()

UIView.transition(with: self.view!, duration: 0.3, options: .transitionCrossDissolve, animations: {

            self.view?.window?.rootViewController = vc

        }, completion: { (true) in

        })

如何根据需要制作此过渡动画?提前谢谢了

标签: swiftxcodeuiviewuiviewcontrolleruiviewanimationtransition

解决方案


func changeRootViewControllerTo(_ controller: UIViewController, animated: Bool = false) {

    UIApplication.shared.keyWindow?.rootViewController = controller

    guard
        animated,
        let window = UIApplication.shared.keyWindow else {
            return
    }

    UIView.transition(with: window,
                      duration: 0.3,
                      options: .transitionCrossDissolve,
                      animations: nil,
                      completion: nil)
}

就我而言,这很完美。我认为您不需要添加这些行
vc.view.frame = (self.view?.frame)! vc.view.layoutIfNeeded()
并更改self.viewwindow过渡方法。


推荐阅读