CollectionNode
A collectionView made for Sprite Kit
installation
Carthage
Carthage is a dependency manager that provides binary frameworks for your projects.
you can install Carthage through Homebrew, with the following command:
$ brew update
$ brew install carthage
Then you need to tell carthage to integrate this framework in your Xcode project, by adding the following to your Cartfile:
github "bwide/CollectionNode"
Now:
- On your project folder, run
carthage update
- On your application target, drag
BWCollectionView.framework
into your Xcode projectEmbedded Binaries
CocoaPods
Add this to your Podfile
pod 'CollectionNode'
important
If you plan to upload your app you must follow additional instructions on Carthage's README on adding frameworks to your application if you're building for iOS, tvOS, or watchOS.
usage
- Import
CollectionNode
module on yourCollectionNodeScene
class:
import CollectionNode
- Add a
CollectionNode
toCollectionNodeScene
and set it's dataSource and Delegate:
private var myCollectionNode: CollectionNode!
override func didMove(to view: SKView) {
myCollectionNode = CollectionNode(at: view)
myCollectionNode.dataSource = self
myCollectionNode.delegate = self
addChild(myCollectionNode)
}
- Conform this
CollectionNodeScene
toCollectionNodeDataSource
and implement all it's methods:
extension GameScene: CollectionNodeDataSource {
func numberOfItems() -> Int {
return EmojiModel.default.emojis.count
}
func collectionNode(_ collection: CollectionNode, itemFor index: Index) -> CollectionNodeItem {
//create and configure items
let item = EmojiItem()
item.emoji = EmojiModel.default.emojis[index]
return item
}
}
- Conform to
CollectionNodeDelegate
and override the methods that you need:
extension GameScene: CollectionNodeDelegate {
func collectionNode(_ collectionNode: CollectionNode, didShowItemAt index: Index) {
let growAction = SKAction.scale(to: 1.3, duration: 0.15)
let shrinkAction = SKAction.scale(to: 1, duration: 0.15)
collectionNode.item(at: index).run(growAction)
collectionNode.children.filter{ emojiCollection.children.index(of: $0) != index }.forEach{ $0.run(shrinkAction) }
}
func collectionNode(_ collectionNode: CollectionNode, didSelectItem item: CollectionNodeItem, at index: Index) {
print("selected \(item.name ?? "noNameItem") at index \(index)")
}
}
- Update your
CollectionNode
with the scene:
override func update(_ currentTime: TimeInterval) {
collectionNode.update(currentTime)
}
- Now
CollectionNode
will work with it's default implementation.
Properties
private(set) public var index: Int
the current index of the CollectionNode
public weak var dataSource: CollectionNodeDataSource?
the object that acts as data source for the collection view
public weak var delegate: CollectionNodeDelegate?
the object that acts as delegate for the collection view
public var spaceBetweenItems: CGFloat
the spacing between elements of the CollectionNode
public var items: [CollectionNodeItem]
returns all the children of this node that are CollectionNodeItems
Methods
public func update(_ currentTime: TimeInterval, dampingRatio: Double)
To be called on the scene's update. Allows this node to animate when touch is released dampingRatio: the ratio for the collectionNode deacceleration (0 to 1 meaning the percentage of speed to deaccelerate when touch is released, default is 1%)
public func snap(to index: Index, withDuration duration: Double)
snaps to an item at a given index duration: The duration of the snap animation in seconds (default is 0.3)
public func reloadData()
reloads all the items in the collection
CollectionNodeDelegate
func collectionNode(_ collectionNode: CollectionNode, didShowItemAt index: Index) -> Void
returns the number of items to be displayed on this collectionNode
func collectionNode(_ collectionNode: CollectionNode, didSelectItem item: CollectionNodeItem, at index: Index ) -> Void
called each time an item is selected
CollectionNodeDataSource
func numberOfItems() -> Int
here you should tell the number of items this collection will display
func collectionNode(_ collection: CollectionNode, itemFor index: Index) -> CollectionNodeItem
here you should return an item for each index in the collectionVIew
Apps using CollectionNode
Show me your apps! if you have used this collection i'd love to see it, reach me in [email protected]
you can send me images and i will post them here.