swift - 如何在 SwiftUI 中通过动画使背景消失?
问题描述
我有这段代码可以在我的应用程序中显示子视图
if showContent {
ZStack {
ContentView(name: "", showAddWindow: false, title: $curLName)
VStack {
HStack {
Button(action: {
withAnimation {
self.showContent.toggle()
}
}) {
Image(systemName: "xmark.circle.fill").font(.title)
Spacer()
}.padding(.leading, 20)
}
Spacer()
}
.padding(.top,15)
}
.background(darkMode ? Color(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)) : Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)))
.animation(.default)
.transition(.move(edge: .trailing))
}
出于某种原因,背景消失了,根本没有动画,而子视图的所有其他元素都有动画,至少可以说看起来很糟糕。我该如何解决?UPD:问题视频:视频
即使在不是由子视图绘制的窗口上,同样的问题仍然存在
if showAddWindow {
VStack {
Text("Добавить список")
.font(.title)
.padding(5)
TextField("Введите название", text: $lName)
.padding(.horizontal,25)
Divider()
HStack {
Button(action: {
if lName != "" {
allists.insert(element(name:lName),at:0)
lName=""
saveNamesList()
self.showAddWindow.toggle()
}}, label: {
Text("ОК")
.padding(.vertical,6)
.padding(.horizontal,56)
})
Divider()
Button(action: {
lName=""
self.showAddWindow.toggle()
}, label: {
Text("Отмена")
.padding(.vertical,6)
.padding(.horizontal,40)
})
}
}
.frame(width:300, height:140)
.background(darkMode ? Color(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)) : Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)))
.clipShape(RoundedRectangle(cornerRadius:25,style: .continuous))
.shadow(radius:15)
.transition(AnyTransition.asymmetric(insertion: .move(edge: .leading), removal: .move(edge:.trailing)))
.animation(.default)
}
解决方案
假设您希望颜色仅在暗模式/亮模式更改时更改:
根据我的经验,以编程方式更改暗模式/亮模式的颜色在 SwiftUI 中效果不佳。相反,您应该在 assets 文件夹中声明对暗模式友好的颜色并使用这些颜色。当用户从浅色模式更改为深色模式时,您还将免费获得一些漂亮的动画。
还有其他方法,但我发现这种方法足够好。这是一篇关于如何定义动态颜色等的有用帖子:https ://medium.com/@drevathy/dark-theme-for-ios-13-in-swift-efc62ef6d16e
编辑:关于过渡不起作用,我在另一个 stackoverflow 问题中找到了解决方案。
基本上,您需要.zIndex([A Sufficient Number Here])
在视图末尾应用 a ,然后到达if showContent { }
. 就像是:
if showContent {
ZStack {
ContentView(name: "", showAddWindow: false, title: $curLName)
VStack {
HStack {
Button(action: {
withAnimation {
self.showContent.toggle()
}
}) {
Image(systemName: "xmark.circle.fill").font(.title)
Spacer()
}.padding(.leading, 20)
}
Spacer()
}
.padding(.top,15)
}
.background(darkMode ? Color(#colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)) : Color(#colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)))
.animation(.default)
.transition(.move(edge: .trailing))
.zIndex(2) // <<------ Note this!
}
推荐阅读
- linux - 尝试调试内核 vmcore 的问题
- grails-2.2 - 生产服务器中的依赖项安装在哪里?
- facebook-graph-api - 是否可以获得 Instagram 个人资料图片和其他基本详细信息?
- java - (已解决)如何为 Android 的 getExternalStorageState() 指定文件路径?
- sql-server - 将变量 1 的相应单元格值匹配到无序变量 2 单元格
- php - 如何在 AWS Amazon Linux AMI 中安装任何 php 扩展?
- python - 如何在 Python 中找到 2 个列表之间的区别?
- android - Ajax 请求未在 android cordova 上发送
- powershell - 如何使用 PowerShell 映射文件夹名称?
- go - 如何使用反射初始化结构的映射字段