KolodaView
请查看我们博客上的这篇文章 如何使用 Swift 构建 Tinder 风格的 Koloda。还有另一篇 文章
目的
KolodaView 是一个类,旨在简化在 iOS 上实现类似 Tinder 的卡片。它添加了方便的功能,例如动态加载视图的 UITableViewDataSource style 的 dataSource/delegate 界面,以及高效视图的加载和卸载。
支持的操作系统与 SDK 版本
- 支持的构建目标 - iOS 11.0(Xcode 9)
ARC 兼容性
KolodaView 需要 ARC。
线程安全
KolodaView 是从 UIView 派生出来的,就像 UIKit 中的所有组件一样,它应该只从主线程访问。您可能希望在加载或更新 KolodaView 内容或项目时使用线程,但始终确保一旦内容加载完毕,在更新 KolodaView 之前回到主线程。
安装
通过 CocoaPods 安装,将以下行添加到您的 Podfile 中。您需要 CocoaPods 1.1 或更高版本
use_frameworks!
pod "Koloda"
通过 Carthage 安装,将以下行添加到您的 Cartfile 中
github "Yalantis/Koloda"
若要手动安装 KolodaView 类到应用中,只需将 KolodaView、DraggableCardView、OverlayView 类文件(不需要演示文件和资源)拖到您的项目中。您还需要安装 facebook-pop。如果您使用 CocoaPods,则需要添加桥接头。
使用方法
-
将
Koloda
模块导入到您的MyKolodaViewController
类中import Koloda
-
将
KolodaView
添加到MyKolodaViewController
,然后为其设置数据源和代理class MyKolodaViewController: UIViewController { @IBOutlet weak var kolodaView: KolodaView! override func viewDidLoad() { super.viewDidLoad() kolodaView.dataSource = self kolodaView.delegate = self } }
-
根据需要使
MyKolodaViewController
符合KolodaViewDelegate
协议并重写一些方法,例如。extension MyKolodaViewController: KolodaViewDelegate { func kolodaDidRunOutOfCards(_ koloda: KolodaView) { koloda.reloadData() } func koloda(_ koloda: KolodaView, didSelectCardAt index: Int) { UIApplication.shared.openURL(URL(string: "https://yalantis.com/")!) } }
-
使
MyKolodaViewController
符合KolodaViewDataSource
协议并实现所有方法,例如。extension MyKolodaViewController: KolodaViewDataSource { func kolodaNumberOfCards(_ koloda:KolodaView) -> Int { return images.count } func kolodaSpeedThatCardShouldDrag(_ koloda: KolodaView) -> DragSpeed { return .fast } func koloda(_ koloda: KolodaView, viewForCardAt index: Int) -> UIView { return UIImageView(image: images[index]) } func koloda(_ koloda: KolodaView, viewForCardOverlayAt index: Int) -> OverlayView? { return Bundle.main.loadNibNamed("OverlayView", owner: self, options: nil)[0] as? OverlayView } }
-
KolodaView
使用默认实现。重写它以自定义其行为
还可以查看使用 Carthage 的一个示例项目。
属性
KolodaView 有以下属性
weak var dataSource: KolodaViewDataSource?
支持 KolodaViewDataSource 协议的对象,可以提供用于填充 KolodaView 的视图。
weak var delegate: KolodaViewDelegate?
支持 KolodaViewDelegate 协议的对象,可以响应用户的 KolodaView 事件。
private(set) public var currentCardIndex
KolodaView 中正面卡片的索引(只读)。
private(set) public var countOfCards
KolodaView 中卡片的总数(只读)。要设置此属性,请实现 dataSource 中的 kolodaNumberOfCards:
方法。
public var countOfVisibleCards
KolodaView 中显示的卡片数。
方法
KolodaView 类有以下方法
public func reloadData()
此方法从 dataSource 重新加载所有 KolodaView 项目视图并刷新显示。
public func resetCurrentCardIndex()
此方法重置当前卡片索引并调用 reloadData,因此 KolodaView 会从头开始加载。
public func revertAction()
应用撤销动画并递减当前卡片索引。
public func applyAppearAnimationIfNeeded()
如果需要,应用出现动画。
public func swipe(_ direction: SwipeResultDirection, force: Bool = false)
应用 swipe 动画和动作,递增当前卡片索引。
open func frameForCard(at index: Int) -> CGRect
计算卡片的帧。如果有必要,可以重写此方法。有关更多信息,请参阅示例。
协议
KolodaView 通过提供两个协议接口,KolodaViewDataSource 和 KolodaViewDelegate,遵循 Apple 的数据驱动视图约定。
KolodaViewDataSource 协议有以下方法
func koloda(_ kolodaNumberOfCards koloda: KolodaView) -> Int
返回 KolodaView 中项目(视图)的数量。
func koloda(_ koloda: KolodaView, viewForCardAt index: Int) -> UIView
返回一个视图,该视图应显示在 KolodaView 中指定的索引。
func koloda(_ koloda: KolodaView, viewForCardOverlayAt index: Int) -> OverlayView?
返回一个视图,用于在指定的索引处显示卡片叠加。对于在滑动(左/右)时设置自定义叠加动作,应在 OverlayView 中的 overlayState 属性的 didSet 中重写。 (请参见示例)
func kolodaSpeedThatCardShouldDrag(_ koloda: KolodaView) -> DragSpeed
允许管理 swipe 动画的持续时间。
KolodaViewDelegate 协议具有以下方法
func koloda(_ koloda: KolodaView, allowedDirectionsForIndex index: Int) -> [SwipeResultDirection]
返回给定卡片的允许方向,默认为 [.left, .right]
func koloda(_ koloda: KolodaView, shouldSwipeCardAt index: Int, in direction: SwipeResultDirection) -> Bool
该方法在 KolodaView 滑动卡片之前被调用。返回 true
或 false
来允许或拒绝滑动。
func koloda(_ koloda: KolodaView, didSwipeCardAt index: Int, in direction: SwipeResultDirection)
每当 KolodaView 滑动卡片时,都会调用此方法。它无论是通过程序方式还是用户交互滑动卡片都会被调用。
func kolodaDidRunOutOfCards(_ koloda: KolodaView)
当 KolodaView 没有卡片可以显示时,会调用此方法。
func koloda(_ koloda: KolodaView, didSelectCardAt index: Int)
当其中一个卡片被点击时,会调用此方法。
func kolodaShouldApplyAppearAnimation(_ koloda: KolodaView) -> Bool
在重新加载时,当任何卡片展示了,会触发该方法。如果你从该方法返回 YES,或者没有实现它,Koloda 将应用出现动画。
func kolodaShouldMoveBackgroundCard(_ koloda: KolodaView) -> Bool
在正面卡片开始滑动时被触发。如果你从该方法返回 YES,或者没有实现它,Koloda 将在正面卡片拖动时移动背景卡片。
func kolodaShouldTransparentizeNextCard(_ koloda: KolodaView) -> Bool
Koloda 的布局和滑动后的调用。如果你从该方法返回 YES,或者没有实现它,Koloda 将使下面正面卡片下的下一张卡片透明化。
func koloda(_ koloda: KolodaView, draggedCardWithPercentage finishPercentage: CGFloat, in direction: SwipeResultDirection)
每当 KolodaView 识别到卡片拖动事件时,会调用此方法。
func kolodaSwipeThresholdRatioMargin(_ koloda: KolodaView) -> CGFloat?
返回需要拖动到触发表格以触发滑动的卡的中心与边缘之间距离的百分比。默认行为(或者返回 NIL)将此阈值设置为距离的一半
func kolodaDidResetCard(_ koloda: KolodaView)
在重置卡片后触发。
func koloda(_ koloda: KolodaView, didShowCardAt index: Int)
动画完成后,卡片被显示后调用此方法。
func koloda(_ koloda: KolodaView, didRewindTo index: Int)
动画完成后,卡片被反弹后调用此方法。
func koloda(_ koloda: KolodaView, shouldDragCardAt index: Int) -> Bool
当卡片开始被拖动时,会调用此方法。如果你从该方法返回 YES,或者没有实现它,卡片将沿着拖动方向移动。如果你返回 NO,卡片将不会移动。
发布说明
版本 5.0.1
- 增加了确定回弹卡片索引的可能性
- 修复了卡片拖动后崩溃的问题
版本 5.0
- Swift 5.0 通过 @maxxfrazer
版本 4.7
- 修复了卡片在滑动时响应的 bug 通过 @lixiang1994
- 修复了布局不恰当的 bug 通过 @soundsmitten
版本 4.6
- 通过 @sroik 和 @leonardoherbert 更新了一些可公开设置的属性
- 支持 Xcode 9 回滚兼容性 通过 @seriyvolk83
- 通过 @lorenzOliveto 增加了卡片堆叠在顶部或底部的可能性
版本 4.5
- Swift 4.2 通过 @evilmint
版本 4.4
- Swift 4.1 通过 @irace
- 通过[brownsoo](https://github.com/brownsoo)增加了
isLoop
属性 - 通过[bwhtmn](https://github.com/bwhtmn)考虑卡片的alpha通道
版本 4.3
- 支持Swift 4
- 修复iOS 11的frame错误
版本 4.0
- 支持Swift 3
- 去除Uint类型
- 常见错误修复
版本 3.1
- 支持多方向
- 禁用滑动时的代理方法
版本 3.0
- 可动态插入/删除/重新加载指定卡片
- 外部动画器
- 主要重构。[更多信息](https://github.com/Yalantis/Koloda/releases/tag/3.0.0)
- 支持Swift 2.2
版本 2.0
- 支持Swift 2.0
版本 1.1
- 新的代理方法
- 修复了一些小问题
版本 1.0
- 发行版本。
使用KolodaView的应用程序
告诉我们!
如果您在我们的项目中使用了我们的组件,我们会非常高兴能收到您项目的链接。只需发送电子邮件到[email protected],并告诉我们您对动画有任何问题或建议。
提示。我们将发布更多包含代码的精彩内容,以及如何制作iOS(Android)UI的最新教程。敬请期待!
许可证
MIT许可证(MIT)
版权所有© 2019 Yalantis
任何获得本软件及其相关文档副本(“软件”)的人均可免费使用该软件而不受任何限制,包括但不限于使用、复制、修改、合并、出版、分发、再许可和/或出售软件副本的权利,并允许将软件提供给他人以供其使用,但前提是遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。
软件按照“原样”提供,没有任何形式的保证,无论是明示的还是隐含的,包括但不限于适销性、特定用途适用性和非侵权性担保。在任何情况下,作者或版权持有者均不对任何索赔、损害或其他责任负责,无论这些责任是根据合同、侵权或任何其他法律诉因而产生的,这些诉因源自、因之而存在或与软件或软件的使用或其他处理有关。