我试图使包含字符串数组的子视图在切换父视图上的按钮时随着动画来回移动.

struct ParentView: View {
  @State isToggle: Bool

  var body: some View {
     
     ChildView(isToggle: isToggle)
         .onTabGesture {
            withAnimation {
               isToggle.toggle()
            }
         }
  }
}


struct ChildView: View {
 
  let values = [one, two, three, four]
  
  var isToggle: Bool

  var body: some View {
    
    HStack {
       ForEach(values) { value in
            Text("\(value)")
                     .frame(width: UIScreen.main.bounds.width / 3)
       }
   }
    .frame(width: UIScreen.main.bounds.width, alignment: isToggle ? .trailing : .leading)
}

我将代码(存储属性更改为viewmodel)更改如下.它按预期工作.

class ViewModel: ObservableObject {

  @Published var values = [one, two, three, four]

}

struct ParentView: View {
  @State isToggle: Bool

  var body: some View {
     
     ChildView(isToggle: isToggle)
         .onTabGesture {
            withAnimation {
               isToggle.toggle()
            }
         }
  }

}


struct ChildView: View {
 
  @EnvironmentObject private vm: ViewModel
  
  var isToggle: Bool

  var body: some View {
    
    HStack {
       ForEach(values) { vm.value in
            Text("\(value)")
                     .frame(width: UIScreen.main.bounds.width / 3)
       }
   }
    .frame(width: UIScreen.main.bounds.width, alignment: isToggle ? .trailing : .leading)
}

我认为切换状态只会在使用存储属性时重画视图.

推荐答案

您的第一段代码中有一些小的拼写错误.如果我纠正它们,代码就会运行,动画就会工作:

struct ContentView: View {
    @State private var isToggle: Bool = false
    
    var body: some View {
        ChildView(isToggle: isToggle)
            .onTapGesture {
                withAnimation {
                    isToggle.toggle()
                }
            }
    }
}

struct ChildView: View {
    let values = ["one", "two", "three", "four"]
    var isToggle: Bool

    var body: some View {
        HStack {
            ForEach(values, id: \.self) { value in
                Text("\(value)")
                    .frame(width: UIScreen.main.bounds.width / 3)
            }
        }
        .frame(width: UIScreen.main.bounds.width, alignment: isToggle ? .trailing : .leading)
    }
}

Ios相关问答推荐

SwiftUI文本编辑器内部滚动填充,无需文本裁剪

SwiftUI拖动手势和内容拖动时的奇怪行为( skip /卡顿)

无法添加以供审阅-Xcode 15.0.1

swift|在具有自定义单元格的多个TableView中没有任何内容

OBJC @selector 在另一个实现中不起作用

拖动手势导致 sim 崩溃 Swift UI

Swift Vision库识别文本后如何将其赋值给 struct 体实例属性以供显示?

创建方案时运行 pod install 时出错

SKScene 的更新功能似乎不起作用

DllImport with .a file for iOS in MAUI

Swift/iOS:泛型错误:协议需要嵌套类型V;你想添加它吗?

如何在应用程序中显示我的小部件的快照?

使用 @MainActor 更新 UI 的适当策略是什么?

Flutter 错误:CocoaPods not installed or not in valid state.

NSFetchedResultsController 由字符串的第一个字母创建的部分

在 iOS 中获取设备位置(仅限国家/地区)

NSURLConnection 的 Xcode 4 警告未使用表达式结果

通过 iOS 创建和导出动画 gif?

无论我将构建版本或应用程序版本更改为什么,都会出现 ITEMS-4238冗余二进制上传错误

如何立即移动 CALayer(无动画)