【发布时间】: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 让“取消”按钮滑入而不看起来像那样