Skip to content

Instantly share code, notes, and snippets.

@plskz
Last active November 18, 2022 04:00
Show Gist options
  • Save plskz/e6b1ccccd6aadbe43c1e7eb14048e772 to your computer and use it in GitHub Desktop.
Save plskz/e6b1ccccd6aadbe43c1e7eb14048e772 to your computer and use it in GitHub Desktop.
Tindog SwiftUI

Tindog SwiftUI

I can't upload the image assets I use here in gist so I'll just upload it on imgur.com

https://imgur.com/a/sNdCO7x

v1

image

v2

image

tindog.v2.mov
import SwiftUI
import PlaygroundSupport
struct User {
var name: String
var desc: String
var img: UIImage
}
struct ContentView: View {
@State private var count: Int = 0
var body: some View {
VStack {
Navbar()
Spacer()
DisplayImage(count: $count)
Spacer()
Selections(count: $count)
Spacer()
}
.padding(20)
.border(.pink)
}
}
struct Navbar: View {
var body: some View {
HStack {
Image(systemName: "star")
Spacer()
Image(systemName: "pawprint.fill")
.foregroundColor(.pink)
Spacer()
Image(systemName: "paperplane")
}
.font(.system(size: 32))
}
}
struct DisplayImage: View {
@Binding var count: Int
let dogs: [User] = [
User(name: "Rudy", desc: "How you doin", img: #imageLiteral(resourceName: "Rudy2.jpg")),
User(name: "Diego", desc: "Can you be my dora", img: #imageLiteral(resourceName: "Diego.jpg")),
User(name: "Mona", desc: "Shy", img: #imageLiteral(resourceName: "Moana.jpg"))
]
var body: some View {
ZStack (alignment: .bottomLeading) {
Image(uiImage: dogs[count].img)
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 800, height: 800)
.clipped()
VStack (alignment: .leading){
Text(dogs[count].name)
.font(.system(size: 64, weight: .heavy))
Text(dogs[count].desc)
.font(.system(size: 32, weight: .heavy))
}
.padding()
.foregroundColor(.white)
}
}
}
struct Selections: View {
@Binding var count: Int
var body: some View {
HStack {
Button {
swipeUser()
} label: {
Image(systemName: "xmark.circle")
}
Button {
swipeUser()
} label: {
Image(systemName: "checkmark.circle")
}
}
.font(.system(size: 64))
}
func swipeUser() {
count += 1
if count > 2 {
count = 0
}
}
}
PlaygroundPage.current.setLiveView(ContentView())
import SwiftUI
import PlaygroundSupport
struct User: Hashable {
var name: String
var desc: String
var img: UIImage
}
struct ContentView: View {
private var dogs: [User] = [
User(name: "Rudy", desc: "How you doin", img: #imageLiteral(resourceName: "Rudy2.jpg")),
User(name: "Diego", desc: "Can you be my dora", img: #imageLiteral(resourceName: "Diego.jpg")),
User(name: "Mona", desc: "Shy", img: #imageLiteral(resourceName: "Moana.jpg"))
].reversed()
var body: some View {
VStack {
Navbar()
.padding()
Spacer()
ZStack {
ForEach(dogs, id: \.self) { dog in
CardView(name: dog.name, desc: dog.desc, img: dog.img)
}
}
Spacer()
}
}
}
struct Navbar: View {
var body: some View {
HStack {
Image(systemName: "star")
Spacer()
Image(systemName: "pawprint.fill")
.foregroundColor(.pink)
Spacer()
Image(systemName: "paperplane")
}
.font(.system(size: 32))
}
}
struct CardView: View {
@State private var offset = CGSize.zero
@State private var color: Color = .black
var name: String
var desc: String
var img: UIImage
var body: some View {
ZStack (alignment: .bottomLeading) {
Image(uiImage: img)
.resizable()
.aspectRatio(contentMode: .fill)
.frame(width: 510, height: 710)
.clipped()
.cornerRadius(4)
.shadow(radius: 4)
VStack (alignment: .leading){
Text(name)
.font(.system(size: 64, weight: .heavy))
Text(desc)
.font(.system(size: 32, weight: .heavy))
}
.padding()
.foregroundColor(.white)
}
.offset(x: offset.width * 1, y: offset.height * 0.4)
.rotationEffect(.degrees(Double(offset.width / 40)))
.gesture(
DragGesture()
.onChanged { gesture in
offset = gesture.translation
}
.onEnded { gesture in
withAnimation {
swipeCard(width: offset.width)
}
}
)
}
func swipeCard(width: CGFloat) {
switch width {
case -500...(-150):
print("\(name) removed")
offset = CGSize(width: -810, height: 0)
case 150...500:
print("\(name) added")
offset = CGSize(width: 810, height: 0)
default:
offset = .zero
}
}
}
PlaygroundPage.current.setLiveView(ContentView())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment