SwiftUI Switch 语句转换行为不符合预期
SwiftUI Switch Statement Transition Behavior is not as expected
与使用两个 if
语句相比,使用 switch
语句更新视图时出现意外 .transition
行为。两个 if
语句按预期将视图滑入和滑出,但是,switch
语句中的相同转换导致视图从一侧滑入并退出另一侧。
我希望使用 switch
语法使我的代码保持一致(关于我如何更新视图),但获得与 if
语句相称的行为。
这是一些示例代码,其中可以观察到表现出不同过渡行为的顶部矩形和底部矩形:
import SwiftUI
enum ExampleStep: Int {
case stepOne
case stepTwo
}
struct TransitionExample: View {
@State var exampleStep:ExampleStep = .stepOne
var body: some View {
VStack {
Button {
withAnimation {
exampleStep = exampleStep == .stepOne ? .stepTwo : .stepOne
}
} label: {
Text("Click Me")
}
Spacer()
if exampleStep == .stepOne {
Rectangle()
.foregroundColor(Color.green)
.frame(width: 100, height: 100)
.transition(.move(edge: .leading))
}
if exampleStep == .stepTwo {
Rectangle()
.foregroundColor(Color.red)
.frame(width: 100, height: 100)
.transition(.move(edge: .trailing))
}
Spacer()
switch exampleStep {
case .stepOne:
Rectangle()
.foregroundColor(Color.green)
.frame(width: 100, height: 100)
.transition(.move(edge: .leading))
case .stepTwo:
Rectangle()
.foregroundColor(Color.red)
.frame(width: 100, height: 100)
.transition(.move(edge: .trailing))
}
Spacer()
}
}
}
struct TransitionExample_Previews: PreviewProvider {
static var previews: some View {
TransitionExample()
}
}
差异可能与 SwiftUI 结果生成器如何将 if
语句转换为 buildIf
、buildEither
等以及 switch
语句的转换方式有关翻译。参见:https://jasonzurita.com/swiftui-if-statement/
如果您在 switch
语句中明确定义非对称转换,看起来您可以获得与 if
语句匹配的行为:
switch exampleStep {
case .stepOne:
Rectangle()
.foregroundColor(Color.green)
.frame(width: 100, height: 100)
.transition(.asymmetric(insertion: .move(edge: .leading), removal: .move(edge: .trailing)))
case .stepTwo:
Rectangle()
.foregroundColor(Color.red)
.frame(width: 100, height: 100)
.transition(.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading)))
}
与使用两个 if
语句相比,使用 switch
语句更新视图时出现意外 .transition
行为。两个 if
语句按预期将视图滑入和滑出,但是,switch
语句中的相同转换导致视图从一侧滑入并退出另一侧。
我希望使用 switch
语法使我的代码保持一致(关于我如何更新视图),但获得与 if
语句相称的行为。
这是一些示例代码,其中可以观察到表现出不同过渡行为的顶部矩形和底部矩形:
import SwiftUI
enum ExampleStep: Int {
case stepOne
case stepTwo
}
struct TransitionExample: View {
@State var exampleStep:ExampleStep = .stepOne
var body: some View {
VStack {
Button {
withAnimation {
exampleStep = exampleStep == .stepOne ? .stepTwo : .stepOne
}
} label: {
Text("Click Me")
}
Spacer()
if exampleStep == .stepOne {
Rectangle()
.foregroundColor(Color.green)
.frame(width: 100, height: 100)
.transition(.move(edge: .leading))
}
if exampleStep == .stepTwo {
Rectangle()
.foregroundColor(Color.red)
.frame(width: 100, height: 100)
.transition(.move(edge: .trailing))
}
Spacer()
switch exampleStep {
case .stepOne:
Rectangle()
.foregroundColor(Color.green)
.frame(width: 100, height: 100)
.transition(.move(edge: .leading))
case .stepTwo:
Rectangle()
.foregroundColor(Color.red)
.frame(width: 100, height: 100)
.transition(.move(edge: .trailing))
}
Spacer()
}
}
}
struct TransitionExample_Previews: PreviewProvider {
static var previews: some View {
TransitionExample()
}
}
差异可能与 SwiftUI 结果生成器如何将 if
语句转换为 buildIf
、buildEither
等以及 switch
语句的转换方式有关翻译。参见:https://jasonzurita.com/swiftui-if-statement/
如果您在 switch
语句中明确定义非对称转换,看起来您可以获得与 if
语句匹配的行为:
switch exampleStep {
case .stepOne:
Rectangle()
.foregroundColor(Color.green)
.frame(width: 100, height: 100)
.transition(.asymmetric(insertion: .move(edge: .leading), removal: .move(edge: .trailing)))
case .stepTwo:
Rectangle()
.foregroundColor(Color.red)
.frame(width: 100, height: 100)
.transition(.asymmetric(insertion: .move(edge: .trailing), removal: .move(edge: .leading)))
}