From 3f0092435afadcb43fbf35640dd2c6a1e439d1da Mon Sep 17 00:00:00 2001 From: Levi McCallum Date: Tue, 6 Oct 2015 12:17:11 -0700 Subject: [PATCH] Add support to move supplementary nodes with section position changes --- .../Details/ASCollectionDataController.mm | 15 ++++++++++++++- .../Details/ASDataController+Subclasses.h | 4 ++-- AsyncDisplayKit/Details/ASDataController.mm | 6 +++--- 3 files changed, 19 insertions(+), 6 deletions(-) diff --git a/AsyncDisplayKit/Details/ASCollectionDataController.mm b/AsyncDisplayKit/Details/ASCollectionDataController.mm index 733594fe4f..e1a0327af3 100644 --- a/AsyncDisplayKit/Details/ASCollectionDataController.mm +++ b/AsyncDisplayKit/Details/ASCollectionDataController.mm @@ -141,7 +141,20 @@ - (void)willMoveSection:(NSInteger)section toSection:(NSInteger)newSection { - // TODO: Implement + NSArray *elementKinds = [self.collectionDataSource supplementaryNodeKindsInDataController:self]; + [elementKinds enumerateObjectsUsingBlock:^(NSString *kind, NSUInteger idx, BOOL *stop) { + NSArray *indexPaths = ASIndexPathsForMultidimensionalArrayAtIndexSet([self editingNodesOfKind:kind], [NSIndexSet indexSetWithIndex:section]); + NSArray *nodes = ASFindElementsInMultidimensionalArrayAtIndexPaths([self editingNodesOfKind:kind], indexPaths); + [self deleteNodesOfKind:kind atIndexPaths:indexPaths completion:nil]; + + // update the section of indexpaths + NSIndexPath *sectionIndexPath = [[NSIndexPath alloc] initWithIndex:newSection]; + NSMutableArray *updatedIndexPaths = [[NSMutableArray alloc] initWithCapacity:indexPaths.count]; + [indexPaths enumerateObjectsUsingBlock:^(NSIndexPath *indexPath, NSUInteger idx, BOOL *stop) { + [updatedIndexPaths addObject:[sectionIndexPath indexPathByAddingIndex:[indexPath indexAtPosition:indexPath.length - 1]]]; + }]; + [self insertNodes:nodes ofKind:kind atIndexPaths:indexPaths completion:nil]; + }]; } - (void)_populateSupplementaryNodesOfKind:(NSString *)kind withMutableNodes:(NSMutableArray *)nodes mutableIndexPaths:(NSMutableArray *)indexPaths diff --git a/AsyncDisplayKit/Details/ASDataController+Subclasses.h b/AsyncDisplayKit/Details/ASDataController+Subclasses.h index ea0d711f53..1bb3615e7e 100644 --- a/AsyncDisplayKit/Details/ASDataController+Subclasses.h +++ b/AsyncDisplayKit/Details/ASDataController+Subclasses.h @@ -59,12 +59,12 @@ /** * Read-only access to the underlying editing nodes of the given kind */ -- (NSArray *)editingNodesOfKind:(NSString *)kind; +- (NSMutableArray *)editingNodesOfKind:(NSString *)kind; /** * Read only access to the underlying completed nodes of the given kind */ -- (NSArray *)completedNodesOfKind:(NSString *)kind; +- (NSMutableArray *)completedNodesOfKind:(NSString *)kind; /** * Measure and layout the given nodes in optimized batches, constraining each to a given size in `constrainedSizeForNodeOfKind:atIndexPath:`. diff --git a/AsyncDisplayKit/Details/ASDataController.mm b/AsyncDisplayKit/Details/ASDataController.mm index e4b0f81fde..85b4ab1925 100644 --- a/AsyncDisplayKit/Details/ASDataController.mm +++ b/AsyncDisplayKit/Details/ASDataController.mm @@ -849,12 +849,12 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; return _editingNodes[kind] != nil ? ASIndexPathsForMultidimensionalArray(_editingNodes[kind]) : [NSArray array]; } -- (NSArray *)editingNodesOfKind:(NSString *)kind +- (NSMutableArray *)editingNodesOfKind:(NSString *)kind { - return _editingNodes[kind] != nil ? _editingNodes[kind] : [NSArray array]; + return _editingNodes[kind] != nil ? _editingNodes[kind] : [NSMutableArray array]; } -- (NSArray *)completedNodesOfKind:(NSString *)kind +- (NSMutableArray *)completedNodesOfKind:(NSString *)kind { return _completedNodes[kind]; }