如果您的拇指向上和向下按钮是CardView 的一部分,那么实现起来将非常简单:只需重复按钮操作内的手势执行的任何代码。大致如下:
// CardView.swift
Button (action: {
// hardcoded for simplicity
self.translation = .init(width: 100, height: 0)
self.swipeStatus = .like
// a hacky way to "wait" for animation to complete
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.3, execute: {
self.onRemove(self.user)
})
}) {
Image(systemName: "hand.thumbsup")
.foregroundColor(.green)
}
但是,如果您的按钮位于 CardView 之外,我认为您将不得不重新设计您的视图。我首先将swipeStatus 从@State 转换为@Binding,因此它的值可以从父视图传递下来。然后您需要在ContentView 中声明一个状态变量,然后您可以将其与swipeStatus 绑定绑定在一起。比如:
// ContentView.swift
@State var currentSwipeStatus: LikeDislike = .none
....
CardView(
swipeStatus: self.users.last == user
? $currentSwipeStatus
: .constant(.none),
user: user,
onRemove: { removedUser in
self.users.removeAll { $0.id == removedUser.id}
self.swipeStatus = .none
})
在您的卡片视图中,您需要对绑定值的变化做出反应。我只是将onChange 附加到主要的VStack:
.onChange(of: swipeStatus) { newState in
if newState == .like {
self.translation = .init(width: 100, height: 0)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.3, execute: {
self.onRemove(self.user)
})
}
}
我觉得有一种更优雅的方式来实现这一点。我不是 onRemove 回调、asyncAfter hack 以及它们同时渲染所有卡片的事实的忠实粉丝。
但至少这是一个开始。