5.4 KiB
Executable File
title, layout, permalink, next
| title | layout | permalink | next |
|---|---|---|---|
| ASCollectionNode | docs | /docs/containers-ascollectionnode.html | containers-aspagernode.html |
ASCollectionNode is equivalent to UIKit's UICollectionView and can be used in place of any UICollectionView.
ASCollectionNode replaces UICollectionView's required method
collectionView:cellForItemAtIndexPath:
with your choice of one of the following methods
- (ASCellNode *)collectionView:(ASCollectionView *)collectionView nodeForItemAtIndexPath:(NSIndexPath *)indexPath
or
- (ASCellNodeBlock)collectionView:(ASCollectionView *)collectionView nodeBlockForItemAtIndexPath:(NSIndexPath *)indexPath (recommended)
As noted in the previous section
- both of these ASCollectionView methods should not implement reuse (they will be called once per row)
- `collectionView:nodeBlockForRowAtIndexPath:` is preferred to `collectionView:nodeForItemAtIndexPath:` for its concurrent processing
- it is very important that node blocks be thread-safe
- ASCellNodes are used by ASTableNode, ASCollectionNod and ASPagerNode
##Replace UICollectionViewController with ASViewController##
AsyncDisplayKit does not offer an equivalent to UICollectionViewController. Instead, use an ASViewController initialized with an ASCollectionNode.
Consider, the ASViewController subclass - LocationCollectionNodeController - from the ASDKgram sample app that uses a collection node as its managed node.
An ASCollectionNode is assigned to be managed by an ASViewController in its initWithNode: designated initializer method.
- (instancetype)initWithCoordinates:(CLLocationCoordinate2D)coordinates
{
_flowLayout = [[UICollectionViewFlowLayout alloc] init];
_collectionNode = [[ASCollectionNode alloc] initWithCollectionViewLayout:_flowLayout];
self = [super initWithNode:_collectionNode];
if (self) {
_flowLayout.minimumInteritemSpacing = 1;
_flowLayout.minimumLineSpacing = 1;
}
return self;
}
func initWithCoordinates(coordinates: CLLocationsCoordinate2D) {
flowLayout = UICollectionViewFlowLayout()
collectionNode = ASCollectionNode(collectionViewLayout: flowLayout)
super.init(node: collectionNode)
flowLayout.minimumInteritemSpacing = 1
flowLayout.minimumLineSpacing = 1
}
##Accessing the ASCollectionView##
If you've used previous versions of ASDK, you'll notice that ASCollectionView has been removed in favor of ASCollectionNode.
Do not forget that anything that accesses a view using AsyncDisplayKit's node containers or nodes should be done in viewDidLoad or didLoad, respectively.
The LocationCollectionNodeController above accesses the ASCollectionView directly in viewDidLoad
- (void)viewDidLoad
{
[super viewDidLoad];
_collectionNode.view.asyncDelegate = self;
_collectionNode.view.asyncDataSource = self;
_collectionNode.view.allowsSelection = NO;
_collectionNode.view.backgroundColor = [UIColor whiteColor];
}
override func viewDidLoad() {
super.viewDidLoad()
collectionNode.view.asyncDelegate = self
collectionNode.view.asyncDataSource = self
collectionNode.view.allowsSelection = false
collectionNode.view.backgroundColor = UIColor.whiteColor()
}
##Table Row Height##
As discussed in the previous ASTableNode section, ASCollectionNodes and ASTableNodes do not need to keep track of the height of their ASCellNodes.
***constrainedSizeForNode (also in table, but more important for collection) - check that (0,0) min and (infinity, infinity) max
- example sample photo grid
- popover, rotated -> how to get size constraint (USE constrainedSizeForNode to do simple divide by 3 width thing)
- document itemSize (check what happens in ASDKgram)
##Sample Apps with ASCollectionNodes##