SwiftUI 转换未发生

Yan*_*ivH 4 ios swiftui swiftui-transition

我是 SwiftUI 的新手,我正在尝试使用.transition,但由于某种原因没有发生转换。

你可以看到下面的代码:

看法

import SwiftUI

struct ContentView: View {
  @ObservedObject var viewModel = ViewModel()
  
  var body: some View {
    if self.viewModel.model.show {
      Text("Showing")
        .padding()
    } else {
      Text("Not Showing")
        .padding()
        .transition(.asymmetric(insertion: .scale, removal: .opacity))
    }
    
    Button {
      self.viewModel.show()
    } label: {
      Text("Tap to change")
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

视图模型

class ViewModel: ObservableObject {
  @Published private(set) var model = Model()
  
  func show() {
    self.model.toggleShow()
  }
}
Run Code Online (Sandbox Code Playgroud)

模型

struct Model {
  var show: Bool = true
  
  mutating func toggleShow() {
    self.show.toggle()
  }
}
Run Code Online (Sandbox Code Playgroud)

当我点击按钮时,文本会发生变化,但不会发生转换。

我觉得我在这里错过了一些微不足道的东西。

有人可以帮忙吗?

Asp*_*eri 10

您需要一个动画(对过渡进行动画处理)和一个容器(执行实际的过渡,因为默认隐式Group不会执行此操作)。

这是代码的固定部分(使用 Xcode 13.2 / iOS 15.2 测试)

*注:Preview > Debug > Slow Animation为了更好的可见性

演示

var body: some View {
    VStack {                            // << this !!
        if self.viewModel.model.show {
            Text("Showing")
                .padding()
        } else {
            Text("Not Showing")
                .padding()
                .transition(.asymmetric(insertion: .scale, removal: .opacity))
        }
    }
    .animation(.default, value: self.viewModel.model.show)  // << here !!

    Button {
        self.viewModel.show()
    } label: {
        Text("Tap to change")
    }
}
Run Code Online (Sandbox Code Playgroud)