Ios 更新绑定时未发生SwiftUI动画
我正在尝试创建一个“弹出视图”,当绑定值为非nil时会出现该视图 我有一个Ios 更新绑定时未发生SwiftUI动画,ios,animation,binding,swiftui,Ios,Animation,Binding,Swiftui,我正在尝试创建一个“弹出视图”,当绑定值为非nil时会出现该视图 我有一个PopupCard类,它是Content和一些Value的通用类 struct PopupCard<Content: View, Value>: View { @Binding private var data: Value? private let content: (Value) -> Content init(data: Binding<Value?>, @V
PopupCard
类,它是Content
和一些Value
的通用类
struct PopupCard<Content: View, Value>: View {
@Binding private var data: Value?
private let content: (Value) -> Content
init(data: Binding<Value?>, @ViewBuilder content: @escaping (Value) -> Content) {
self._data = data
self.content = content
}
var body: some View {
Group {
if data != nil {
HStack {
self.content(self.data!)
.padding()
Spacer()
}
.frame(width: UIScreen.main.bounds.width - 40)
.background(
Rectangle()
.fill(Color.yellow)
.shadow(color: Color.black.opacity(0.2), radius: 5, y: 0)
)
.offset(y: self.data == nil ? -100 : 0)
.animation(.default)
}
}
}
}
extension View {
func popup<Content: View, Value>(data: Binding<Value?>, @ViewBuilder content: @escaping (Value) -> Content) -> some View {
return ZStack {
self
VStack {
Spacer()
PopupCard(data: data, content: content)
}
}
}
}
除了动画,这一切都很好。该卡按预期显示和消失,但没有动画。这将在下面的预览中演示
struct PopupCard_Previews: PreviewProvider {
struct PreviewView: View {
@State var name: String? = "Hello"
var body: some View {
TabView {
Button("Toggle", action: {
self.name = self.name == nil ? "Hello" : nil
})
.popup(data: $name) { string in
Text(string)
}
}
}
}
static var previews: some View {
PreviewView()
}
}
我怎样才能让它成为输入/输出的动画?这里有一个固定的变体(如果我正确理解了意图的话)。使用Xcode 11.4/iOS 13.4进行测试
struct弹出卡:查看{
@绑定私有var数据:值?
私有出租内容:(值)->内容
init(数据:绑定,@ViewBuilder内容:@escaping(Value)->content){
self.\u data=数据
self.content=内容
}
var body:一些观点{
团体{
HStack{
如果数据!=nil{
self.content(self.data!).padding()
}否则{
正文(“”)
}
垫片()
}
.frame(宽度:UIScreen.main.bounds.width-40)
.背景(
矩形()
.填充(颜色.黄色)
阴影(颜色:颜色。黑色。不透明度(0.2),半径:5,y:0)
)
.compositingGroup()
.offset(y:self.data==nil?100:0)
.animation(.default)
}
}
}
struct PopupCard<Content: View, Value>: View {
@Binding private var data: Value?
private let content: (Value) -> Content
init(data: Binding<Value?>, @ViewBuilder content: @escaping (Value) -> Content) {
self._data = data
self.content = content
}
var body: some View {
Group {
HStack {
if data != nil {
self.content(self.data!).padding()
} else {
Text("")
}
Spacer()
}
.frame(width: UIScreen.main.bounds.width - 40)
.background(
Rectangle()
.fill(Color.yellow)
.shadow(color: Color.black.opacity(0.2), radius: 5, y: 0)
)
.compositingGroup()
.offset(y: self.data == nil ? 100 : 0)
.animation(.default)
}
}
}