日安!
我有两个按钮,一个带有X,另一个表示取消.根据我按下的按钮,我希望X按钮有不同的过渡.
按X键时: 我希望删除的X按钮是.opacity.Animation(.Default)
按取消时: 我希望删除的X按钮是.move(边:.traending).组合(与:.opacity).动画(.Default)
对于上下文,它是一个文本字段,当我输入一些东西时,X按钮就会出现.
我try 了使用State变量,在按钮操作中设置了With Animation中的过渡. 这似乎设定了下一个周期/更新的过渡,而不是当前的周期/更新. 我也调查过交易,但我只能从那里操纵动画?
因此,当我按下X按钮时,下一次我按下X或取消时,它将是我设置的过渡.当我按下Cancel时,下一次它会将转换设置为他们的另一个转换.
正如你在GIF中看到的,它在转换之间循环,但我希望 for each 按钮设置它们.
预期行为:
当按X键时,我希望它使用.不透明度淡出.
当按下Cancel时,我希望X按钮"滑出",使用.move作为删除过渡.
import Combine
import Foundation
import SwiftUI
struct SearchBar: View {
@Binding var searchField: String
let clearSearchField: () -> Void
let isFocus: Bool
let setFocus: (Bool) -> Void
@State var transition: AnyTransition = .opacity.animation(.default)
var body: some View {
HStack(spacing: 16) {
ZStack {
Color.gray
VStack(alignment: .leading) {
HStack {
TextField(
"Placeholder",
text: $searchField,
onEditingChanged: { _ in setFocus(true) }
)
.foregroundColor(.white)
Spacer()
if searchField.isNonEmpty {
Button {
transition = .opacity.animation(.default)
withAnimation {
clearSearchField()
}
} label: {
Text("X")
}
.transition(
.asymmetric(
insertion: .opacity.animation(.default),
removal: transition
)
)
}
}
}
.padding(16)
}
.cornerRadius(8)
if isFocus {
Button(
action: {
transition = .move(edge: .trailing).combined(with: .opacity)
hideKeyboard()
clearSearchField()
setFocus(false)
},
label: {
Text("Cancel")
.foregroundColor(.white)
}
)
.transition(.move(edge: .trailing).combined(with: .opacity).animation(.default))
}
}
.frame(height: 48)
.foregroundColor(searchField.isEmpty ? .grey: .white)
.padding(16)
.animation(.default, value: [isFocus])
}
}
这个是可能的吗?
感谢任何人的帮助!