KSSwipeStack
KSSwipeStack 是一个用于 iOS 的轻量级卡片滑动库,用 Swift 编写。
KSSwipeStack 可以处理任何数据模型,滑动卡片的布局设计完全可定制。
利用提供的选择,您可以定制滑动堆栈中的行为和动画。
功能
内置支持
示例
要运行示例项目,请克隆仓库,然后从示例目录运行 pod install
安装
KSSwipeStack 通过 CocoaPods 提供。要安装它,只需将以下行添加到您的 Podfile 中
pod "KSSwipeStack"
开始使用
SwipeView
创建一个SwipeView 是滑动堆叠的容器。
- 最简单的形式无需传递任何参数
swipeView.setup()
- 您还可以使用传递 SwipeOptions 参数作为设置的
setup
方法的设置,以修改堆叠的行为。有关如何使用 SwipeOptions 的更多详细信息,请参阅 选项 部分。
var swipeOptions = SwipeOptions()
swipeOptions.allowVerticalSwipes = true
swipeView.setup(options: swipeOptions)
- 最后,您可以将一个 SwipeDelegate 引用传递给(如果您不想使用 RxSwift),或者单独传递
swipeView.setup(swipeDelegate: self)
- ...或者与一些自定义 SwipeOptions 一起传递
swipeView.setup(swipeOptions: swipeOptions, swipeDelegate: self)
SwipableView 的自定义类
创建一个扩展以适当的方式表示您的数据项。
class ExampleCard: SwipableView {
override func setData(_ data: SwipableData) {
super.setData(data)
backgroundColor = .kicksortGray
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: frame.width - 100, height: 200))
imageView.contentMode = .scaleAspectFit
imageView.image = #imageLiteral(resourceName: "kicksortLogoInverted")
imageView.center = center
addSubview(imageView)
}
}
SwipableData 的简单数据模型。
创建一个实现协议该协议只有一个方法,getView,其中您需要返回一个 SwipableView。
func getView(with frame: CGRect) -> SwipableView {
let view = ExampleCard(frame: frame)
view.setData(self)
return view
}
向堆栈添加卡片
您可以添加任意数量、任意类型的卡片到同一个堆栈中。通过调用addCard并传入一个实现了SwipableData接口的参数来添加卡片。
swipeView.addCard(ExampleData())
处理滑动操作
RxSwift
使用通过简单地设置观察者,您可以使用RxSwift观察堆栈中所有滑动事件。
swipeView.getSwipes().subscribe(onNext: { (swipe) in
print("RX SWIPE EVENT")
}, onError: nil, onCompleted: nil, onDisposed: nil).addDisposableTo(disposableBag)
您还可以根据在滑动选项中提供的填充阈值来观察堆栈是否需要填充。
swipeView.needsRefill().subscribe(onNext: { (swipe) in
print("RX REFILL EVENT")
}, onError: nil, onCompleted: nil, onDisposed: nil).addDisposableTo(disposableBag)
SwipeDelegate
使用在设置SwipeView时,您可以为接收到的堆栈滑动操作提供实现SwipeDelegate的类。
swipeView.setup(options: SwipeOptions(), swipeDelegate: self)
extension ViewController: SwipeDelegate {
func onNext(_ swipe: Swipe) {
dump("DELEGATE SWIPE EVENT")
}
}
附加功能
撤销滑动操作
调用 undoSwipe()
方法,可以将最新滑过的卡片移动到栈中。您可以多次调用该方法,以便在滑动历史中回退更多步骤。注意,可以通过将 SwipeOptions 中的 allowUndo
设置为 false 来禁用此功能。
swipeView.undoSwipe()
如果您想防止特定的卡片被添加到滑动历史(因此在调用 undoSwipe()
时被跳过),您应该为该 SwipableView 重写 isUndoable()
并返回 false。
选项
使用 SwipeOptions 结构体可以修改滑动栈的行为。
public struct SwipeOptions {
public var throwingThreshold = Float(800)
public var snapDuration = 0.1
public var allowHorizontalSwipes = true
public var allowVerticalSwipes = false
public var horizontalPanThreshold = CGFloat(0.5)
public var verticalPanThreshold = CGFloat(0.5)
public var visibleImageOrigin = CGPoint(x: 0, y: 0)
public var allowUndo = true
public var maxRenderedCards = 5
public var refillThreshold = 10
public var dismissAnimationDuration = 0.25
public var freezeWhenDismissing = false
public init(){}
}
指定需要投掷卡片多“硬”才能将其删除。
public var throwingThreshold = Float(800)
回弹动画的持续时间。
public var snapDuration = 0.1
使滑动栈对水平滑动做出响应。
public var allowHorizontalSwipe = true
使滑动层对垂直滑动做出响应。
public var allowVerticalSwipe = false
卡片释放时删除卡片的 X 轴阈值。
public var horizontalPanThreshold = CGFloat(0.5)
卡片在“原始”状态下的位置。
public var visibleImageOrigin = CGPoint(x: 0, y: 0)
允许撤销滑动。
public var allowUndo = true
SwipeView 同时渲染的卡片数量。
public var maxRenderedCards = 5
发送填充事件到填充订阅者的阈值。
public var refillThreshold = 10
删除动画的持续时间。
public var dismissAnimationDuration = 0.25
可选地,在删除卡片后选择冻结栈以防止用户滑动。
public var freezeWhenDismissing = false
作者
arneson,Simon Arneson,[email protected]
Sundin,Gustav Sundin,[email protected]
许可
KSSwipeStack 在 MIT 许可下可用。有关更多信息,请参阅 LICENSE 文件。