TinderSwipingAnimation is an easy to use library written using SwiftUI to simplify the implementation of the tinder swipe animation.
- File > Swift Packages > Add Package Dependency
- Add
https://github.com/omarthamri/TinderSwipingAnimation.git - Select "Up to Next Major" with "1.9.2"
target 'MyApp' do
pod 'MyTinderSwipingAnimation', '~> 1.9'
end
The import statement in this case will be
import MyTinderSwipingAnimation
Xcode 15 made a significant change by setting the default value of the ENABLE_USER_SCRIPT_SANDBOXING Build Setting from NO to YES. As a result, when installing TinderSwipingAnimation with cocoapods we encounters an error related to missing file permissions, which typically manifests as follows: error: Sandbox: rsync.samba(10816) deny(1) file-read-data.
To resolve this issue, it is necessary to manually set the ENABLE_USER_SCRIPT_SANDBOXING setting to NO in Build Settings.
in the top of your view file add the code below:
import TinderSwipingAnimation
A basic implementation example would be like this:
struct ContentView: View {
let cards: [CardModel] = [ // This is the data to be shown in Card
CardModel(name: "Brie", imageName: "brie", age: "34"),
CardModel(name: "Scarlett", imageName: "scarlett", age: "38"),
CardModel(name: "Elizabeth", imageName: "elizabeth", age: "33")
]
let buttons: [ButtonModel] = [ // those are the buttons to be shown in the card
ButtonModel(image: Image(systemName: "xmark"), color: .pink),
ButtonModel(image: Image(systemName: "heart.fill"), color: .red),
ButtonModel(image: Image(systemName: "bubble.fill"), color: .purple),
ButtonModel(image: Image(systemName: "bolt.fill"), color: .blue)
]
var body: some View {
TinderSwipingAnimation(cards: cards, buttons: buttons) { (cardModel,direction) in // Closure to be called when a card is swiped.
print("Swiped \(cardModel.name) to \(direction.description)")
}
}
}
To Perform a swipe using buttons you just need to pass the action to do in the ButtonModel initializer.There are the following predefined actions .goLeft or .goRight or .goTop or .goBottom or .none. By default buttons are create with .none action.
let buttons: [ButtonModel] = [ // those are the buttons to be shown in the card
ButtonModel(image: Image(systemName: "xmark"), color: .pink,action: .goLeft), // swipe left when button clicked
ButtonModel(image: Image(systemName: "heart.fill"), color: .red,action: .goTop), // swipe top when button clicked
ButtonModel(image: Image(systemName: "bubble.fill"), color: .purple,action: .goBottom), // swipe bottom when button clicked
ButtonModel(image: Image(systemName: "bolt.fill"), color: .blue,action: .goRight) // swipe right when button clicked
]
To return the most recently swiped card to the top of your card stack you just need to pass the action .undo in the ButtonModel initializer.
ButtonModel(image: Image(systemName: "gobackward"), color: .pink,action: .undo)
If you want to modify the colors or fonts in the card
TinderSwipingAnimation(cards: cards, buttons: buttons) { (cardModel,direction) in // Closure to be called when a card is swiped.
print("Swiped \(cardModel.name) to \(direction.description)")
}
.tinderSwipingStyle(titleColor: .red, subtitleColor: .red, titleFont: .largeTitle, subtitleFont: .largeTitle)
If you want to change the orientation of the text inside your card you can use options with .orientation. we got two orientations options .horizontal and .vertical. By default the text orientation inside the card is .vertical.
You can also use options with .backgroundColor to change the background color of the card. By default the background color of the card is .white.
TinderSwipingAnimation(
cards: cards,
buttons: buttons,
onSwipe: { (cardModel,direction) in // Closure to be called when a card is swiped.
print("Swiped \(cardModel.name) to \(direction.description)")
}, options: [
.orientation(.horizontal), // this is setting text orientation inside card to horizontal
.backgroundColor(.yellow) // This setting background color inside card to yellow
])
- iOS 17.0+
Omar Thamri, @ThamriOmar
TinderSwipingAnimation is released under the MIT license. See LICENSE for details.
