A multi-directional card swiping library inspired by Tinder and TanTan.
Due to project reasons, I often need to use the card sliding effect. At the beginning, I also searched for various three-party libraries on GitHub. Fortunately, I found it. But I am not very satisfied, either some of the functions I want are missing, or I feel that the sliding effect of the card is not good, or there are some bugs, and finally I have to modify the source code. After tossing around like this a few times, I decided to write one.
I refer some third-party libraries:
- Advanced swipe recognition based on velocity and card position.
- Multiple built-in card stacking styles.
- Manual and programmatic actions.
- Smooth card overlay view transitions.
- Similar to UITableView, dynamic card loading using data source pattern.
- Deployment target iOS 11.0+
- Swift 5+
- Xcode 14+
pod 'DragCardContainer'Or
pod 'DragCardContainer', :git => "https://github.com/liujunliuhong/DragCardContainer.git"Create your own card container and setting its properties directly.
let cardContainer = DragCardContainer()
// 是否可以无限滑动
cardContainer.infiniteLoop = false
// 数据源
cardContainer.dataSource = self
// 代理
cardContainer.delegate = self
// 可见卡片数量
cardContainer.visibleCount = 3
// 是否可以打印日志
cardContainer.enableLog = true
// 是否禁用卡片拖动
cardContainer.disableTopCardDrag = false
// 是否禁用卡片点击
cardContainer.disableTopCardClick = falseYou can custom mode. Mode is a protocol, ScaleMode implements the Mode protocol.
let mode = ScaleMode()
// 卡片之间间距
mode.cardSpacing = 10
// 方向(可以运行Demo,修改该参数看实际效果)
mode.direction = .bottom
// 最小缩放比例
mode.minimumScale = 0.7
// 卡片最大旋转角度
mode.maximumAngle = 0
// 赋值mode
cardContainer.mode = modeCustom Card, inherited from DragCardView.
public final class CardView: DragCardView { }You must conform the protocol DragCardDataSource.
public func numberOfCards(_ dragCard: DragCardContainer) -> Int {
    return 10
}
public func dragCard(_ dragCard: DragCardContainer, viewForCard index: Int) -> DragCardView {
    let cardView = CardView()
    cardView.allowedDirection = [.left, .right]
    return cardView
}The protocol DragCardDelegate is optional.
public func dragCard(_ dragCard: DragCardContainer, displayTopCardAt index: Int, with cardView: DragCardView) {
    print("displayTopCardAt: \(index)")
}
public func dragCard(_ dragCard: DragCardContainer, didRemovedTopCardAt index: Int, direction: Direction, with cardView: DragCardView) {
    print("didRemovedTopCardAt: \(index)")
}
public func dragCard(_ dragCard: DragCardContainer, didRemovedLast cardView: DragCardView) {
    print("didRemovedLast")
}
public func dragCard(_ dragCard: DragCardContainer, didSelectTopCardAt index: Int, with cardView: DragCardView) {
    print("didSelectTopCardAt: \(index)")
}The user can swipe views in the allowed directions. This can also happen programmatically.
cardContainer.swipeTopCard(to: .right)Returns the most recently swiped card to the top of the card stack.
cardContainer.rewind(from: .right)You can set top level card index.
cardContainer.currentTopIndex = 2liujun, [email protected]
