which is scrolling and stopping comfortably like Snapchat and Instagram
SnapLikeCollectionView
The collectionView library which is scaling, scrolling and stopping comfortably like Snapchat and Instagram.
Demo1
Comparison with Instagram and Snapchat.
? This ? | Snapchat | |
---|---|---|
Demo2
You can change cell height since ver. 1.1.0
Requirements
Swift 4.2. Ready for use on iOS 11.0+
Installation
via Cocoapods
pod 'SnapLikeCollectionView'
Usage
Cell
You should use SnapLikeCell protocol.
Item is associatedtype. You can apply any model you want.
This Item becomes dataSource's items.
public protocol SnapLikeCell: class {
associatedtype Item
var item: Item? { get set }
}
Below is example.
import UIKit
import SnapLikeCollectionView
class SampleCell: UICollectionViewCell, SnapLikeCell {
@IBOutlet weak var titleLabel: UILabel!
var item: String? {
didSet {
titleLabel.text = item
}
}
}
ViewController
import UIKit
import SnapLikeCollectionView
class ViewController: UIViewController {
@IBOutlet weak var titleLabel: UILabel!
@IBOutlet weak var collectionView: UICollectionView!
// set your original Cell to <SampleCell>
private var dataSource: SnapLikeDataSource<SampleCell>?
override func viewDidLoad() {
super.viewDidLoad()
// setup size of cells
let cellSize = SnapLikeCellSize(normalWidth: 100, centerWidth: 160)
// create dataSource
dataSource = SnapLikeDataSource<SampleCell>(collectionView: collectionView, cellSize: cellSize)
dataSource?.delegate = self
// create FlowLayout
let layout = SnapLikeCollectionViewFlowLayout(cellSize: cellSize)
collectionView.collectionViewLayout = layout
// setup collectionView like this
collectionView.registerNib(SampleCell.self)
collectionView.showsHorizontalScrollIndicator = false
collectionView.decelerationRate = .fast
collectionView.delegate = dataSource
collectionView.dataSource = dataSource
// pass arrays which type is decided `Item` in the SampleCell.
dataSource?.items = ["A", "B", "C", "D", "E"]
}
}
// listen selected listener
extension ViewController: SnapLikeDataDelegate {
func cellSelected(_ index: Int) {
DispatchQueue.main.async { [weak self] in
let selectedItem: String = self?.dataSource?.items[index] ?? ""
self?.titleLabel.text = selectedItem
}
}
}