动画不适用于 SwiftUI 视图状态更改
Animation not applied to SwiftUI view state change
我正在尝试对应用于 SwiftUI TextField 的叠加层的更改进行动画处理。叠加层的状态由状态变量(简单布尔值)控制,大多数参考资料建议将 .animation() 添加到 Toggle 控件内此变量的绑定中应该可以解决问题。但是,它似乎没有效果。我已经尝试将相同的修改器添加到用于覆盖的视图中,并将覆盖的组件视图包装在动画块中 - 再次,没有快乐。
有趣的是,当 运行 canvas 或模拟器中的代码可能很重要时,我注意到一个错误:
2020-02-25 22:00:19.360009+0000 Sandbox[9392:671490] invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_RunCalledWithInvalidMode to debug. This message will only appear once per execution.
代码如下(它是原型制作所以有点粗糙和准备)。谁能告诉我我错过了什么?
import SwiftUI
struct ContentView: View {
@State private var isValid = true
var body: some View {
VStack {
Form {
TextField("Placeholder", text: .constant(""))
.padding(6)
.background(ErrorView(isValid: $isValid)
.overlay(RoundedRectangle(cornerRadius: 4)
.stroke(Color(.systemGray3), lineWidth: 1))
.padding()
Toggle(isOn: $isValid.animation(.easeInOut), label: { Text("Toggle Valid") })
}
}
}
}
struct ErrorView: View {
@Binding var isValid: Bool
var body: some View {
if isValid {
return AnyView(EmptyView())
} else {
return AnyView(
ZStack {
HStack {
Spacer()
Image(systemName: "exclamationmark.triangle.fill")
.foregroundColor(Color.red)
.padding(.trailing, 8)
}
HStack {
Spacer()
Text("error message")
.font(.caption)
.foregroundColor(Color.red)
.offset(x: 0, y: -28)
}
}
)
}
}
}
这是可能的方法,稍微简化了,(测试并适用于 Xcode 11.2 / iOS 13.2)
struct ContentView: View {
@State private var isValid = true
var body: some View {
VStack {
Form {
TextField("Placeholder", text: .constant(""))
.padding(6)
.background(ErrorView().opacity(isValid ? 0.0 : 1.0))
.overlay(RoundedRectangle(cornerRadius: 4)
.stroke(Color(.systemGray3), lineWidth: 1))
.padding()
Toggle(isOn: $isValid.animation(), label: { Text("Toggle Valid") })
}
}
}
}
struct ErrorView: View {
var body: some View {
ZStack {
HStack {
Spacer()
Image(systemName: "exclamationmark.triangle.fill")
.foregroundColor(Color.red)
.padding(.trailing, 8)
}
HStack {
Spacer()
Text("error message")
.font(.caption)
.foregroundColor(Color.red)
.offset(x: 0, y: -28)
}
}
}
}
我正在尝试对应用于 SwiftUI TextField 的叠加层的更改进行动画处理。叠加层的状态由状态变量(简单布尔值)控制,大多数参考资料建议将 .animation() 添加到 Toggle 控件内此变量的绑定中应该可以解决问题。但是,它似乎没有效果。我已经尝试将相同的修改器添加到用于覆盖的视图中,并将覆盖的组件视图包装在动画块中 - 再次,没有快乐。
有趣的是,当 运行 canvas 或模拟器中的代码可能很重要时,我注意到一个错误:
2020-02-25 22:00:19.360009+0000 Sandbox[9392:671490] invalid mode 'kCFRunLoopCommonModes' provided to CFRunLoopRunSpecific - break on _CFRunLoopError_RunCalledWithInvalidMode to debug. This message will only appear once per execution.
代码如下(它是原型制作所以有点粗糙和准备)。谁能告诉我我错过了什么?
import SwiftUI
struct ContentView: View {
@State private var isValid = true
var body: some View {
VStack {
Form {
TextField("Placeholder", text: .constant(""))
.padding(6)
.background(ErrorView(isValid: $isValid)
.overlay(RoundedRectangle(cornerRadius: 4)
.stroke(Color(.systemGray3), lineWidth: 1))
.padding()
Toggle(isOn: $isValid.animation(.easeInOut), label: { Text("Toggle Valid") })
}
}
}
}
struct ErrorView: View {
@Binding var isValid: Bool
var body: some View {
if isValid {
return AnyView(EmptyView())
} else {
return AnyView(
ZStack {
HStack {
Spacer()
Image(systemName: "exclamationmark.triangle.fill")
.foregroundColor(Color.red)
.padding(.trailing, 8)
}
HStack {
Spacer()
Text("error message")
.font(.caption)
.foregroundColor(Color.red)
.offset(x: 0, y: -28)
}
}
)
}
}
}
这是可能的方法,稍微简化了,(测试并适用于 Xcode 11.2 / iOS 13.2)
struct ContentView: View {
@State private var isValid = true
var body: some View {
VStack {
Form {
TextField("Placeholder", text: .constant(""))
.padding(6)
.background(ErrorView().opacity(isValid ? 0.0 : 1.0))
.overlay(RoundedRectangle(cornerRadius: 4)
.stroke(Color(.systemGray3), lineWidth: 1))
.padding()
Toggle(isOn: $isValid.animation(), label: { Text("Toggle Valid") })
}
}
}
}
struct ErrorView: View {
var body: some View {
ZStack {
HStack {
Spacer()
Image(systemName: "exclamationmark.triangle.fill")
.foregroundColor(Color.red)
.padding(.trailing, 8)
}
HStack {
Spacer()
Text("error message")
.font(.caption)
.foregroundColor(Color.red)
.offset(x: 0, y: -28)
}
}
}
}