【问题标题】:SwiftUI: FocusState animations stop working when using NavigationViewsSwiftUI:使用 NavigationViews 时 FocusState 动画停止工作
【发布时间】:2022-06-12 11:10:02
【问题描述】:

我正在尝试实现与 TextField 相关的动画。单击文本字段时会滑入取消按钮。但是,它只有在独立视图中才能正常工作。当我尝试将视图嵌套在 NavigationLink 中时,动画停止工作。代码如下:

struct TestView: View {
    @FocusState private var isEditing: Bool
    
    var body: some View {
        VStack {
            Button("click me", action: { isEditing.toggle() })

            HStack {
                TextField("Search", text: .constant("test"))
                    .focused($isEditing)
                    .padding(8)
                    .padding(.leading, 25)
                    .padding(.trailing, 22)
                    .background(Color.gray)
                    .cornerRadius(10)
                    .padding(.horizontal)
                if isEditing {
                    Button {} label: {
                        ZStack {
                            Text("Cancel")
                                .foregroundColor(.primary)
                                .padding(.trailing)
                        }
                    }
                    .transition(.move(edge: .trailing))
                }
            }
            .animation(.spring(), value: isEditing)
            .navigationBarHidden(true)
        }
    }
}

正确的动画: https://imgur.com/iqGr7fx

但是,当我有第二个视图时,其 NavigationLink 包含前一个视图:

struct TestView2: View {
    @State var test: Bool = false
    
    var body: some View {
        NavigationView {
            VStack {
                NavigationLink(isActive: $test, destination: { TestView() }, label: {})
                Button("click me", action: { test.toggle() })
            }
            .navigationBarHidden(true)
        }
    }
}

动画如下所示: https://imgur.com/a/LK9pxf2

这是与 SwiftUI 相关的错误吗?还是我不应该将 FocusState 用于动画?如果是这样,如何更改代码以使动画在两个版本中都可以工作?

【问题讨论】:

  • NavigationView 已被弃用,所以不要花时间在它上面 - 它非常非常非常......嗯具体:)
  • 我必须检查新的导航管理器!
  • 你使用哪个操作系统很有趣,因为在 iOS 15.5 上,我看到两种情况下的动画完全不同,而且都很奇怪。 :)
  • 他们似乎在内部使用 withAnimation on isEditing 改变这就是为什么一切都是动画并且不能被阻止的原因。
  • 我在 iOS 15.5 上,我刚刚在一个新项目中尝试过,第一个版本现在似乎也给了我这个错误。我在另一个项目中实现了它,结果是我链接的视频。我不确定如何编辑代码以使用 .transition 和 .spring 让“取消”按钮滑入而不看起来像那样

标签: swift swiftui


【解决方案1】:

通过将 FocusState 变量更改为 State 变量,然后删除 .focused 修饰符并将其更改为 .onTapGesture 并将 isEditing 变量设置为 true 来修复动画

【讨论】:

    猜你喜欢
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 2014-11-25
    • 1970-01-01
    相关资源
    最近更新 更多