5.3 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, you can use the flexibility of ASViewController to recreate any type of UIViewController.
Consider, the following ASViewController subclass.
An ASCollectionNode is assigned to be managed by an ASViewController in its initWithNode: designated initializer method, thus making it a sort of ASCollectionNodeController.
- (instancetype)init
{
_flowLayout = [[UICollectionViewFlowLayout alloc] init];
_collectionNode = [[ASCollectionNode alloc] initWithCollectionViewLayout:_flowLayout];
self = [super initWithNode:_collectionNode];
if (self) {
_flowLayout.minimumInteritemSpacing = 1;
_flowLayout.minimumLineSpacing = 1;
}
return self;
}
init() {
flowLayout = UICollectionViewFlowLayout()
collectionNode = ASCollectionNode(collectionViewLayout: flowLayout)
super.init(node: collectionNode)
flowLayout.minimumInteritemSpacing = 1
flowLayout.minimumLineSpacing = 1
}
This works just as well with any node such as an ASTableNode, ASPagerNode, etc.
##Accessing the ASCollectionView##
If you've used previous versions of ASDK, you'll notice that ASCollectionView has been removed in favor of ASCollectionNode.
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##