Skip to content

Instantly share code, notes, and snippets.

@cyrilzakka
Last active July 16, 2019 08:36
Show Gist options
  • Save cyrilzakka/f302d2d7c12feb813b6e088bf5eba215 to your computer and use it in GitHub Desktop.
Save cyrilzakka/f302d2d7c12feb813b6e088bf5eba215 to your computer and use it in GitHub Desktop.
struct Card : Identifiable {
var id = UUID()
var imageName: String
}
struct CardView: View {
var card: Card
var body: some View {
return ZStack(alignment: .top) {
Image(card.imageName)
.resizable()
.renderingMode(.original)
}
.cornerRadius(20)
}
}
struct CardDeckView: View {
@State var cards: [Card] = []
@State var dragOffset: CGSize = .zero
@State var isMoving = false
var body: some View {
ZStack(alignment: .center) {
ForEach(cards) { card in
CardView(card: card)
// General Appearance
.zIndex(Double(self.cards.count - 1) - Double(self.order(for: card)))
.scaleEffect((self.isMoving && self.order(for: card) != 0) ? 0.92 - CGFloat(self.order(for: card)-1) * 0.1:0.92 - CGFloat(self.order(for: card)) * 0.1)
.offset(x: 0, y: (self.isMoving && self.order(for: card) != 0) ? -CGFloat(self.order(for: card)-1) * 30.0:-CGFloat(self.order(for: card)) * 30.0)
.opacity((self.isMoving && self.order(for: card) != 0) ? 1 - Double(self.order(for: card)-1) * 0.3:1 - Double(self.order(for: card)) * 0.3)
// Animations
.offset(x: self.order(for: card) == 0 ? self.dragOffset.width : 0, y: self.order(for: card) == 0 ? self.dragOffset.height: 0)
.animation(.fluidSpring(stiffness: 90, dampingFraction: 0.5))
// Gesture
.gesture(DragGesture()
.onChanged({ value in
self.dragOffset = value.translation
self.isMoving = true
})
.onEnded({ _ in
if self.dragOffset.width < -200 {
self.sendToBack(self.cards[0])
} else if self.dragOffset.width > 200 {
self.sendToBack(self.cards[0])
} else {
self.dragOffset = .zero
}
self.isMoving = false
})
)
}
}
.offset(x: 0, y: 10)
}
private func order(for card: Card) -> Int {
return cards.firstIndex(where: { $0.id == card.id })!
}
private func sendToBack(_ card: Card) {
guard let idx = cards.firstIndex(where: { $0.id == card.id }) else { return }
var mutablecards = cards
let mutablecard = card
mutablecards.remove(at: idx)
mutablecards.append(mutablecard)
cards = mutablecards
self.dragOffset = .zero
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment