【发布时间】:2019-12-29 13:53:37
【问题描述】:
在 SwiftUI 中,我们使用 NavigationView 和 NavigationLink 视图来执行导航(我们过去在 UIKit 中称为 segue)。 UIKit 中的标准segue 是show segue。在 SwiftUI 中我们可以简单地做:
struct ContentView: View {
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: Text("Destination")) {
Text("Navigate!")
}
}
}
}
}
具有完全相同的效果(即使 segue 这个词已经消失)。
有时(实际上相当频繁)我们需要自定义转场动画。
- 我们可以决定根本不为 segue 设置动画,实际上在
故事板我们可以找到属性
Animates(true/false) 通过单击 segue 来进行属性检查器。这样,目标视图控制器会立即出现在源视图控制器的位置。 - 或者我们可以决定执行自定义动画。通常这是通过实现一个符合
UIViewControllerAnimatedTransitioning协议的对象来完成的。所有的魔法都发生在animateTransition方法中,它使我们能够访问源视图控制器和目标视图控制器。
例如,一个简单的交叉淡入淡出转场动画可能是这样的:
-(void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext{
UIView* containerView = [transitionContext containerView];
UIViewController* fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController* toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];
toVC.view.alpha = 0;
[containerView addSubview:toVC.view];
[UIView animateWithDuration:1 animations:^{
toVC.view.alpha = 1;
fromVC.view.alpha = 0;
} completion:^(BOOL finished) {
[fromVC.view removeFromSuperview];
[transitionContext completeTransition:YES];
}];
}
现在的问题是:如何在 SwiftUI 中获得相同的效果?是否可以不为导航设置动画或自定义导航动画?我希望能够做到:
struct ContentView: View {
var body: some View {
NavigationView {
VStack {
NavigationLink(destination: Text("Destination")) {
Text("Navigate!")
}
}
}
.animation(nil)
}
}
或类似的东西阻止动画(或添加自定义动画),但没有任何变化。
【问题讨论】:
-
有些过渡可以使用甚至组合,但我自己没有尝试过。
-
我认为 SwiftUI 还没有内置这个功能,但可以通过一些黑客攻击来实现它。如果我以后想到什么我会发布答案
-
要禁用导航动画检查这个答案:stackoverflow.com/a/59481362/8397245
-
@FRIDDAY 谢谢,非常好的解决方法,我赞成你的回答。如果我们也能找到一种自定义过渡动画的方法,那就太好了。
-
自定义动画也存在于 SwiftUI 中 swiftui-lab.com/advanced-transitions
标签: ios swift animation uikit swiftui