我有一个可以在任何屏幕上访问的注销按钮,当点击时,我想弹出当前在导航控制器堆栈上的所有视图控制器,并转换为仅作为根视图控制器的登录屏幕导航控制器。但我希望转换就像翻转整个屏幕一样。
我看到一些要使用的代码:
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;取决于帮助解决方案的好人。 :)
答案 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 +。