我试图创建一个非常简单的过渡动画,通过点击按钮在屏幕中央显示/隐藏一条消息:

struct ContentView: View {
    @State private var showMessage = false

    var body: some View {
        ZStack {
            Color.yellow

            VStack {
                Spacer()
                Button(action: {
                    withAnimation(.easeOut(duration: 3)) {
                        self.showMessage.toggle()
                    }
                }) {
                    Text("SHOW MESSAGE")
                }
            }

            if showMessage {
                Text("HELLO WORLD!")
                    .transition(.opacity)
            }
        }
    }
}

根据.transition(.opacity)动画的文档

插入时从透明到不透明的过渡,以及从不透明到透明的过渡

showMessage state属性变为true时,消息应淡入,当变为false时,消息应淡出.我的情况并非如此.该消息显示为淡入淡出动画,但隐藏时完全没有动画.有什么 idea 吗?

EDIT:在下面取自模拟器的gif中查看结果.

enter image description here

推荐答案

问题是,当视图在ZStack中出现和消失时,它们的"zIndex"不会保持不变.所发生的事情是,当"showMessage"从true变为false时,带有"Hello World"文本的VStack被放在堆栈的底部,黄色立即被绘制在堆栈的顶部.它实际上正在淡出,但它在黄色后面淡出,所以你看不见它.

要解决此问题,需要为堆栈中的每个视图显式指定"zIndex",以便它们始终保持不变,如下所示:

struct ContentView: View {
@State private var showMessage = false

var body: some View {
    ZStack {
        Color.yellow.zIndex(0)

        VStack {
            Spacer()
            Button(action: {
                withAnimation(.easeOut(duration: 3)) {
                    self.showMessage.toggle()
                }
            }) {
                Text("SHOW MESSAGE")
            }
        }.zIndex(1)

        if showMessage {
            Text("HELLO WORLD!")
                .transition(.opacity)
                .zIndex(2)
        }
    }
}

}

Swift相关问答推荐

在Swift中如何用变量计算0.9的立方

根据其属性组合 2 个模型以在 Swift 中创建另一个模型

(Swift)混淆了函数内 for-in 循环的返回值和循环后(函数内)的返回值)

为什么我在我的 Swift iOS 应用程序项目中收到 Xcode 中的错误消息无法识别的 Select 器发送到类?

Firebase removeObserver 在 Swift 5 中不起作用

签署GoogleSignIn-GoogleSignIn需要开发团队

Vapor 4 身份验证问题 [用户未通过身份验证]

ZStack 中的 ProgressView 与 View 的行为不同

如何在 Swift 中的两个 UIView 中心之间添加线?

如何将回调传递给 View init

`IndexSet` 永远不会是空的?

如何获取 NSRunningApplication 的参数?

找不到目标AAA的 SPM 工件 - 仅限 Xcode 13.3

如何在 Swift 中复制字典?

如何在 Swift 中将 UILabel 居中?

使用 phimagemanager 将图像保存到自定义相册?

使用 Swift 以编程方式自定义 UITableViewCell

如何在 Swift 中重写 setter

我可以让#selector 引用 Swift 中的闭包吗?

iPhone 纵向和 iPad 横向的通用应用程序