jus*_*nny 4 iphone ios swift swift5 swiftui
我想在 SwiftUI 中创建一个视图,动态添加一个带有动画的子视图。
struct ContentView : View {
@State private var isButtonVisible = false
var body: some View {
VStack {
Toggle(isOn: $isButtonVisible.animation()) {
Text("add view button")
}
if isButtonVisible {
AnyView(DetailView())
.transition(.move(edge: .trailing))
.animation(Animation.linear(duration: 2))
}else{
AnyView(Text("test"))
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码可以很好地处理动画。但是,当我将视图选择部分移动到函数中时,动画不再起作用(因为我想动态添加不同的视图,因此,我将逻辑放在一个函数中。)
struct ContentView : View {
@State private var isButtonVisible = false
var body: some View {
VStack {
Toggle(isOn: $isButtonVisible.animation()) {
Text("add view button")
}
subView().transition(.move(edge: .trailing))
.animation(Animation.linear(duration: 2))
}
func subView() -> some View {
if isButtonVisible {
return AnyView(DetailView())
}else{
return AnyView(Text("test"))
}
}
}
Run Code Online (Sandbox Code Playgroud)
对我来说看起来完全一样,但是,我不明白为什么它们会有不同的结果。有人可以解释我为什么吗?以及任何更好的解决方案?多谢!
这是您的代码,已修改以使其正常工作:
struct ContentView : View {
@State private var isButtonVisible = false
var body: some View {
VStack {
Toggle(isOn: $isButtonVisible.animation()) {
Text("add view button")
}
subView()
.transition(.move(edge: .trailing))
.animation(Animation.linear(duration: 2))
}
}
func subView() -> some View {
Group {
if isButtonVisible {
DetailView()
} else {
Text("test")
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
注意两点:
Group视图中。然后您返回的类型是Group,它将正确地设置动画。DetailView()或Text("test")。更新
该Group方法将只与工作if,elseif和else语句。如果要使用开关,则必须将每个分支包装在AnyView(). 但是,这会破坏过渡/动画。目前无法使用switch 和设置自定义动画。
| 归档时间: |
|
| 查看次数: |
3841 次 |
| 最近记录: |