From f7f20ca8b74170f1a896f541dfe505d33b79679b Mon Sep 17 00:00:00 2001 From: Huy Nguyen Date: Thu, 13 Aug 2015 07:18:32 +0300 Subject: [PATCH] preferredFrameSize should be used even if neither -layoutSpecThatFits: nor -calculateSizeThatFits: is overridden by subclassses. --- AsyncDisplayKit/ASDisplayNode.mm | 14 ++++++++------ AsyncDisplayKit/Private/ASDisplayNodeInternal.h | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 32b4eee832..07a546ea85 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -150,8 +150,8 @@ void ASDisplayNodeRespectThreadAffinityOfNode(ASDisplayNode *node, void (^block) if (ASDisplayNodeSubclassOverridesSelector([self class], @selector(touchesEnded:withEvent:))) { overrides |= ASDisplayNodeMethodOverrideTouchesEnded; } - if (ASDisplayNodeSubclassOverridesSelector([self class], @selector(calculateSizeThatFits:))) { - overrides |= ASDisplayNodeMethodOverrideCalculateSizeThatFits; + if (ASDisplayNodeSubclassOverridesSelector([self class], @selector(layoutSpecThatFits:))) { + overrides |= ASDisplayNodeMethodOverrideLayoutSpecThatFits; } _methodOverrides = overrides; @@ -1337,10 +1337,7 @@ static NSInteger incrementIfFound(NSInteger i) { - (ASLayout *)calculateLayoutThatFits:(ASSizeRange)constrainedSize { ASDisplayNodeAssertThreadAffinity(self); - if (_methodOverrides & ASDisplayNodeMethodOverrideCalculateSizeThatFits) { - CGSize size = [self calculateSizeThatFits:constrainedSize.max]; - return [ASLayout newWithLayoutableObject:self size:ASSizeRangeClamp(constrainedSize, size)]; - } else { + if (_methodOverrides & ASDisplayNodeMethodOverrideLayoutSpecThatFits) { id layoutSpec = [self layoutSpecThatFits:constrainedSize]; ASLayout *layout = [layoutSpec measureWithSizeRange:constrainedSize]; // Make sure layoutableObject of the root layout is `self`, so that the flattened layout will be structurally correct. @@ -1351,6 +1348,11 @@ static NSInteger incrementIfFound(NSInteger i) { return [layout flattenedLayoutUsingPredicateBlock:^BOOL(ASLayout *evaluatedLayout) { return [_subnodes containsObject:evaluatedLayout.layoutableObject]; }]; + } else { + // If neither -layoutSpecThatFits: nor -calculateSizeThatFits: is overridden by subclassses, preferredFrameSize should be used, + // assume that the default implementation of -calculateSizeThatFits: returns it. + CGSize size = [self calculateSizeThatFits:constrainedSize.max]; + return [ASLayout newWithLayoutableObject:self size:ASSizeRangeClamp(constrainedSize, size)]; } } diff --git a/AsyncDisplayKit/Private/ASDisplayNodeInternal.h b/AsyncDisplayKit/Private/ASDisplayNodeInternal.h index c3e476a441..5a8883ed02 100644 --- a/AsyncDisplayKit/Private/ASDisplayNodeInternal.h +++ b/AsyncDisplayKit/Private/ASDisplayNodeInternal.h @@ -28,7 +28,7 @@ typedef NS_OPTIONS(NSUInteger, ASDisplayNodeMethodOverrides) { ASDisplayNodeMethodOverrideTouchesCancelled = 1 << 1, ASDisplayNodeMethodOverrideTouchesEnded = 1 << 2, ASDisplayNodeMethodOverrideTouchesMoved = 1 << 3, - ASDisplayNodeMethodOverrideCalculateSizeThatFits = 1 << 4 + ASDisplayNodeMethodOverrideLayoutSpecThatFits = 1 << 4 }; @class _ASPendingState;