diff --git a/AsyncDisplayKit/ASContextTransitioning.h b/AsyncDisplayKit/ASContextTransitioning.h index 8f0493a3b2..3b48a5e02b 100644 --- a/AsyncDisplayKit/ASContextTransitioning.h +++ b/AsyncDisplayKit/ASContextTransitioning.h @@ -15,10 +15,21 @@ */ - (BOOL)isAnimated; +/** + * @abstract The destination layout being transitioned to + */ - (ASLayout *)layout; +/** + * @abstrat The destination constrainedSize being transitioned to + */ - (ASSizeRange)constrainedSize; +/** + * @abstract Subnodes in the new layout + */ +- (NSArray *)subnodes; + /** @abstract The frame for the given node before the transition began. @discussion Returns CGRectNull if the node was not in the hierarchy before the transition. diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index d87fc4656b..2000f87de0 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -652,11 +652,10 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c) { ASDisplayNodeAssertThreadAffinity(self); ASDN::MutexLocker l(_propertyLock); + ASLayout *newLayout; if (![self __shouldSize]) - return nil; - - ASLayout *newLayout; + return newLayout; // only calculate the size if // - we haven't already @@ -664,32 +663,29 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c) if (!_flags.isMeasured || !ASSizeRangeEqualToSizeRange(constrainedSize, _constrainedSize)) { newLayout = [self calculateLayoutThatFits:constrainedSize]; - if ([[self class] usesImplicitHierarchyManagement]) { - if (_layout) { - NSIndexSet *insertions, *deletions; - [_layout.immediateSublayouts asdk_diffWithArray:newLayout.immediateSublayouts - insertions:&insertions - deletions:&deletions - compareBlock:^BOOL(ASLayout *lhs, ASLayout *rhs) { - return ASObjectIsEqual(lhs.layoutableObject, rhs.layoutableObject); - }]; - _insertedSubnodes = [self _nodesInLayout:newLayout atIndexes:insertions]; - _deletedSubnodes = [self _nodesInLayout:_layout atIndexes:deletions filterNodes:_insertedSubnodes]; - } else { - NSIndexSet *indexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [newLayout.immediateSublayouts count])]; - _insertedSubnodes = [self _nodesInLayout:newLayout atIndexes:indexes]; - _deletedSubnodes = nil; - } - - if (animated) { - [self __transitionToLayout:newLayout constrainedSize:constrainedSize animated:animated]; - } else { + if (_layout) { + NSIndexSet *insertions, *deletions; + [_layout.immediateSublayouts asdk_diffWithArray:newLayout.immediateSublayouts + insertions:&insertions + deletions:&deletions + compareBlock:^BOOL(ASLayout *lhs, ASLayout *rhs) { + return ASObjectIsEqual(lhs.layoutableObject, rhs.layoutableObject); + }]; + _insertedSubnodes = [self _nodesInLayout:newLayout atIndexes:insertions]; + _deletedSubnodes = [self _nodesInLayout:_layout atIndexes:deletions filterNodes:_insertedSubnodes]; + } else { + NSIndexSet *indexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, [newLayout.immediateSublayouts count])]; + _insertedSubnodes = [self _nodesInLayout:newLayout atIndexes:indexes]; + _deletedSubnodes = nil; + } + + if (animated) { + [self __transitionToLayout:newLayout constrainedSize:constrainedSize animated:animated]; + } else { + if ([[self class] usesImplicitHierarchyManagement]) { [self __implicitlyInsertSubnodes]; [self __implicitlyRemoveSubnodes]; - [self __updateLayout:newLayout constrainedSize:constrainedSize]; } - } else { - // 1.9.x code path [self __updateLayout:newLayout constrainedSize:constrainedSize]; } } @@ -1079,52 +1075,33 @@ static inline CATransform3D _calculateTransformFromReferenceToTarget(ASDisplayNo - (void)__implicitlyInsertSubnodes { - if ([_insertedSubnodes count]) { - for (_ASDisplayNodePosition *position in _insertedSubnodes) { - [self insertSubnode:position.node atIndex:position.index]; - } - _insertedSubnodes = nil; + for (_ASDisplayNodePosition *position in _insertedSubnodes) { + [self insertSubnode:position.node atIndex:position.index]; } + _insertedSubnodes = nil; } - (void)__implicitlyRemoveSubnodes { - if ([_deletedSubnodes count]) { - for (_ASDisplayNodePosition *position in _deletedSubnodes) { - [position.node removeFromSupernode]; - } - _deletedSubnodes = nil; + for (_ASDisplayNodePosition *position in _deletedSubnodes) { + [position.node removeFromSupernode]; } + _deletedSubnodes = nil; } #pragma mark - _ASTransitionContextDelegate +- (NSArray *)currentSubnodesWithTransitionContext:(_ASTransitionContext *)context +{ + return _subnodes; +} + - (void)transitionContext:(_ASTransitionContext *)context didComplete:(BOOL)didComplete { [self didCompleteTransitionLayout:context]; _transitionContext = nil; } -- (CGRect)transitionContext:(_ASTransitionContext *)context initialFrameForNode:(ASDisplayNode *)node -{ - for (ASDisplayNode *subnode in _subnodes) { - if (ASObjectIsEqual(node, subnode)) { - return node.frame; - } - } - return CGRectNull; -} - -- (CGRect)transitionContext:(_ASTransitionContext *)context finalFrameForNode:(ASDisplayNode *)node -{ - for (ASLayout *layout in _layout.sublayouts) { - if (ASObjectIsEqual(node, layout.layoutableObject)) { - return [self _adjustedFrameForLayout:layout]; - } - } - return CGRectNull; -} - #pragma mark - _ASDisplayLayerDelegate - (void)willDisplayAsyncLayer:(_ASDisplayLayer *)layer diff --git a/AsyncDisplayKit/_ASTransitionContext.h b/AsyncDisplayKit/_ASTransitionContext.h index 21d6babea7..a35a395c0b 100644 --- a/AsyncDisplayKit/_ASTransitionContext.h +++ b/AsyncDisplayKit/_ASTransitionContext.h @@ -15,9 +15,8 @@ @protocol _ASTransitionContextDelegate +- (NSArray *)currentSubnodesWithTransitionContext:(_ASTransitionContext *)context; - (void)transitionContext:(_ASTransitionContext *)context didComplete:(BOOL)didComplete; -- (CGRect)transitionContext:(_ASTransitionContext *)context initialFrameForNode:(ASDisplayNode *)node; -- (CGRect)transitionContext:(_ASTransitionContext *)context finalFrameForNode:(ASDisplayNode *)node; @end diff --git a/AsyncDisplayKit/_ASTransitionContext.m b/AsyncDisplayKit/_ASTransitionContext.m index d5dd171ba4..5a6d1e08d4 100644 --- a/AsyncDisplayKit/_ASTransitionContext.m +++ b/AsyncDisplayKit/_ASTransitionContext.m @@ -8,6 +8,8 @@ #import "_ASTransitionContext.h" +#import "ASLayout.h" + @interface _ASTransitionContext () @property (weak, nonatomic) id<_ASTransitionContextDelegate> delegate; @@ -30,12 +32,31 @@ - (CGRect)initialFrameForNode:(ASDisplayNode *)node { - return [_delegate transitionContext:self initialFrameForNode:node]; + for (ASDisplayNode *subnode in [_delegate currentSubnodesWithTransitionContext:self]) { + if (node == subnode) { + return node.frame; + } + } + return CGRectZero; } - (CGRect)finalFrameForNode:(ASDisplayNode *)node { - return [_delegate transitionContext:self finalFrameForNode:node]; + for (ASLayout *layout in _layout.immediateSublayouts) { + if (layout.layoutableObject == node) { + return [layout frame]; + } + } + return CGRectZero; +} + +- (NSArray *)subnodes +{ + NSMutableArray *subnodes = [NSMutableArray array]; + for (ASLayout *sublayout in _layout.immediateSublayouts) { + [subnodes addObject:(ASDisplayNode *)sublayout.layoutableObject]; + } + return subnodes; } - (void)completeTransition:(BOOL)didComplete