如何在UINavigationController屏幕转换时翻转整个屏幕?

时间:2018-03-08 03:41:55

标签: ios swift animation uinavigationcontroller transition

我有一个可以在任何屏幕上访问的注销按钮,当点击时,我想弹出当前在导航控制器堆栈上的所有视图控制器,并转换为仅作为根视图控制器的登录屏幕导航控制器。但我希望转换就像翻转整个屏幕一样。

我看到一些要使用的代码:

UIView.transitionFromView(frontView, toView: backView, duration: 1, options: UIViewAnimationOptions.TransitionFlipFromRight | UIViewAnimationOptions.ShowHideTransitionViews, completion: nil)

但这只是转换UIView,而不是整个屏幕。

更重要的是,如果我将self.view作为frontView提供,这可能会用于更改整个屏幕,但这意味着我只更改当前顶视图控制器的frontView,而不更改任何视图控制器堆栈在导航控制器中。

如何翻转整个屏幕,同时更改导航控制器的堆栈?

我想可能有一些代码:

func logout() {
    let loginVc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "login")
    UIView.animate (duration: 0.3, options: UIViewAnimationOptions.TransitionFlipFromRight) {
        self.navigationController?.viewControllers = [loginVc];
    }
}

我已经尝试了这个,但改变发生在瞬间,而不是动画。

感谢。

编辑:

澄清我想要的东西,是我想要的:

UINavigationController with stack: [Vc1, Vc2, Vc3, Vc4, Vc5, ...]

要:

UINavigationController with stack: [LoginVc]

使用整个屏幕翻转动画。

这是通过弹出到root还是替换堆栈或完全替换UINavigationController来完成的,无论是使用UIView.animate还是UIView.transitionFromView还是其他人,或者上面的任何组合, #39;取决于帮助解决方案的好人。 :)

1 个答案:

答案 0 :(得分:0)

您可以通过多种方式实现这一目标,最佳解决方案是将其设置的方式,您的用户界面允许的内容以及个人偏好的组合。

例如,当用户点击退出按钮时,您可以使用翻转动画使用登录表单以模态方式呈现视图控制器,并将导航到其背景中的导航(用户将看不到)。因此,当用户登录时,解除视图控制器会将用户带到导航的根目录。

另一种选择可能是为根视图控制器提供两种不同的状态。当用户登录时,通常会显示内容。当用户注销时,将显示登录表单。如果视图控制器相对简单,您可以使用isHidden属性完成此任务。

无论你采取什么样的路线,制作翻转动画的最简单方法是:

guard let nav = navigationController else {
    return
}

UIView.transition(with: nav.view, duration: 0.75, options: .transitionFlipFromLeft, animations: {
    nav.popToRootViewController(animated: false)
}, completion: nil)

您的翻页选项:

.transitionFlipFromLeft
.transitionFlipFromRight
.transitionFlipFromTop
.transitionFlipFromBottom

自从引入UIView以来,Apple现在不鼓励使用此方法,因为所有UIViewPropertyAnimator动画方法都是如此。但UIViewPropertyAnimator仅符合iOS 10 +。