From 7e8d519a9ad8041e39cb4e752e1e5f7612faeef3 Mon Sep 17 00:00:00 2001 From: Levi McCallum Date: Wed, 8 Jun 2016 18:28:21 -0700 Subject: [PATCH] Introduce type property to replace layout id check --- AsyncDisplayKit/ASDisplayNode.mm | 9 ++++++++- AsyncDisplayKit/Layout/ASLayout.h | 5 +++++ AsyncDisplayKit/Layout/ASLayout.mm | 12 +++++++++--- AsyncDisplayKit/Layout/ASLayoutSpec.mm | 8 +++++++- AsyncDisplayKit/Layout/ASLayoutable.h | 8 +++++++- 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 290abcc86c..2ddfcf185f 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -62,7 +62,9 @@ NSString * const ASRenderingEngineDidDisplayNodesScheduledBeforeTimestamp = @"AS @implementation ASDisplayNode // these dynamic properties all defined in ASLayoutOptionsPrivate.m -@dynamic spacingAfter, spacingBefore, flexGrow, flexShrink, flexBasis, alignSelf, ascender, descender, sizeRange, layoutPosition; +@dynamic spacingAfter, spacingBefore, flexGrow, flexShrink, flexBasis, + alignSelf, ascender, descender, sizeRange, layoutPosition, layoutableType; + @synthesize name = _name; @synthesize preferredFrameSize = _preferredFrameSize; @synthesize isFinalLayoutable = _isFinalLayoutable; @@ -659,6 +661,11 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c) return _layout == nil || _layout.isDirty; } +- (ASLayoutableType)layoutableType +{ + return ASLayoutableTypeDisplayNode; +} + #pragma mark - Layout Transition - (void)transitionLayoutWithAnimation:(BOOL)animated diff --git a/AsyncDisplayKit/Layout/ASLayout.h b/AsyncDisplayKit/Layout/ASLayout.h index a0e190c761..60acb5f218 100644 --- a/AsyncDisplayKit/Layout/ASLayout.h +++ b/AsyncDisplayKit/Layout/ASLayout.h @@ -31,6 +31,11 @@ extern BOOL CGPointIsNull(CGPoint point); */ @property (nonatomic, weak, readonly) id layoutableObject; +/** + * The type of ASLayoutable that created this layout + */ +@property (nonatomic, readonly) ASLayoutableType type; + /** * Size of the current layout */ diff --git a/AsyncDisplayKit/Layout/ASLayout.mm b/AsyncDisplayKit/Layout/ASLayout.mm index 56d270b164..0b4db6b58b 100644 --- a/AsyncDisplayKit/Layout/ASLayout.mm +++ b/AsyncDisplayKit/Layout/ASLayout.mm @@ -12,7 +12,6 @@ #import "ASAssert.h" #import "ASDimension.h" -#import "ASDisplayNode.h" #import "ASInternalHelpers.h" #import "ASLayoutSpecUtilities.h" @@ -36,7 +35,7 @@ extern BOOL CGPointIsNull(CGPoint point) @implementation ASLayout -@dynamic frame; +@dynamic frame, type; - (instancetype)initWithLayoutableObject:(id)layoutableObject constrainedSizeRange:(ASSizeRange)sizeRange @@ -159,7 +158,7 @@ extern BOOL CGPointIsNull(CGPoint point) Context context = queue.front(); queue.pop(); - if (self != context.layout && [context.layout.layoutableObject isKindOfClass:[ASDisplayNode class]]) { + if (self != context.layout && context.layout.type == ASLayoutableTypeDisplayNode) { ASLayout *layout = [ASLayout layoutWithLayout:context.layout position:context.absolutePosition]; layout.flattened = YES; [flattenedSublayouts addObject:layout]; @@ -178,6 +177,13 @@ extern BOOL CGPointIsNull(CGPoint point) sublayouts:flattenedSublayouts]; } +#pragma mark - Accessors + +- (ASLayoutableType)type +{ + return _layoutableObject.layoutableType; +} + - (CGRect)frame { CGRect subnodeFrame = CGRectZero; diff --git a/AsyncDisplayKit/Layout/ASLayoutSpec.mm b/AsyncDisplayKit/Layout/ASLayoutSpec.mm index 5c84591e78..16cfba3853 100644 --- a/AsyncDisplayKit/Layout/ASLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASLayoutSpec.mm @@ -34,7 +34,8 @@ @implementation ASLayoutSpec // these dynamic properties all defined in ASLayoutOptionsPrivate.m -@dynamic spacingAfter, spacingBefore, flexGrow, flexShrink, flexBasis, alignSelf, ascender, descender, sizeRange, layoutPosition; +@dynamic spacingAfter, spacingBefore, flexGrow, flexShrink, flexBasis, + alignSelf, ascender, descender, sizeRange, layoutPosition, layoutableType; @synthesize isFinalLayoutable = _isFinalLayoutable; - (instancetype)init @@ -48,6 +49,11 @@ return self; } +- (ASLayoutableType)layoutableType +{ + return ASLayoutableTypeLayoutSpec; +} + #pragma mark - Layout - (ASLayout *)measureWithSizeRange:(ASSizeRange)constrainedSize diff --git a/AsyncDisplayKit/Layout/ASLayoutable.h b/AsyncDisplayKit/Layout/ASLayoutable.h index 325a81535c..6d37e2a4b5 100644 --- a/AsyncDisplayKit/Layout/ASLayoutable.h +++ b/AsyncDisplayKit/Layout/ASLayoutable.h @@ -21,6 +21,11 @@ @class ASLayout; @class ASLayoutSpec; +typedef NS_ENUM(NSUInteger, ASLayoutableType) { + ASLayoutableTypeLayoutSpec, + ASLayoutableTypeDisplayNode +}; + NS_ASSUME_NONNULL_BEGIN /** @@ -41,6 +46,8 @@ NS_ASSUME_NONNULL_BEGIN */ @protocol ASLayoutable +@property (nonatomic, readonly) ASLayoutableType layoutableType; + /** * @abstract Calculate a layout based on given size range. * @@ -50,7 +57,6 @@ NS_ASSUME_NONNULL_BEGIN */ - (ASLayout *)measureWithSizeRange:(ASSizeRange)constrainedSize; - #pragma mark - Layout options from the Layoutable Protocols #pragma mark - ASStackLayoutable