[ASDisplayNode] Move constrainedSize to layout

This commit is contained in:
Levi McCallum
2016-05-20 12:43:35 -07:00
parent a004cc7263
commit 19e949e02f
4 changed files with 13 additions and 37 deletions

View File

@@ -616,25 +616,20 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c)
[self cancelLayoutTransitionsInProgress]; [self cancelLayoutTransitionsInProgress];
ASLayout *previousLayout = _layout; ASLayout *previousLayout = _layout;
ASSizeRange previousConstrainedSize = _constrainedSize;
ASLayout *newLayout = [self calculateLayoutThatFits:constrainedSize]; ASLayout *newLayout = [self calculateLayoutThatFits:constrainedSize];
if (ASHierarchyStateIncludesLayoutPending(_hierarchyState)) { if (ASHierarchyStateIncludesLayoutPending(_hierarchyState)) {
_pendingLayoutTransition = [[ASLayoutTransition alloc] initWithNode:self _pendingLayoutTransition = [[ASLayoutTransition alloc] initWithNode:self
pendingLayout:newLayout pendingLayout:newLayout
pendingConstrainedSize:constrainedSize previousLayout:previousLayout];
previousLayout:previousLayout
previousConstrainedSize:previousConstrainedSize];
} else { } else {
ASLayoutTransition *layoutContext; ASLayoutTransition *layoutContext;
if (self.usesImplicitHierarchyManagement) { if (self.usesImplicitHierarchyManagement) {
layoutContext = [[ASLayoutTransition alloc] initWithNode:self layoutContext = [[ASLayoutTransition alloc] initWithNode:self
pendingLayout:newLayout pendingLayout:newLayout
pendingConstrainedSize:constrainedSize previousLayout:previousLayout];
previousLayout:previousLayout
previousConstrainedSize:previousConstrainedSize];
} }
[self applyLayout:newLayout constrainedSize:constrainedSize layoutContext:layoutContext]; [self applyLayout:newLayout layoutContext:layoutContext];
[self _completeLayoutCalculation]; [self _completeLayoutCalculation];
} }
@@ -658,7 +653,7 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c)
// only calculate the size if // only calculate the size if
// - we haven't already // - we haven't already
// - the constrained size range is different // - the constrained size range is different
return (!_flags.isMeasured || !ASSizeRangeEqualToSizeRange(constrainedSize, _constrainedSize)); return (!_flags.isMeasured || !ASSizeRangeEqualToSizeRange(constrainedSize, _layout.constrainedSizeRange));
} }
#pragma mark - Layout Transition #pragma mark - Layout Transition
@@ -667,9 +662,8 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c)
shouldMeasureAsync:(BOOL)shouldMeasureAsync shouldMeasureAsync:(BOOL)shouldMeasureAsync
measurementCompletion:(void(^)())completion measurementCompletion:(void(^)())completion
{ {
ASSizeRange currentConstrainedSize = _constrainedSize;
[self invalidateCalculatedLayout]; [self invalidateCalculatedLayout];
[self transitionLayoutWithSizeRange:currentConstrainedSize [self transitionLayoutWithSizeRange:_layout.constrainedSizeRange
animated:animated animated:animated
shouldMeasureAsync:shouldMeasureAsync shouldMeasureAsync:shouldMeasureAsync
measurementCompletion:completion]; measurementCompletion:completion];
@@ -732,8 +726,7 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c)
} }
ASLayout *previousLayout = _layout; ASLayout *previousLayout = _layout;
ASSizeRange previousConstrainedSize = _constrainedSize; [self applyLayout:newLayout layoutContext:nil];
[self applyLayout:newLayout constrainedSize:constrainedSize layoutContext:nil];
ASDisplayNodePerformBlockOnEverySubnode(self, ^(ASDisplayNode * _Nonnull node) { ASDisplayNodePerformBlockOnEverySubnode(self, ^(ASDisplayNode * _Nonnull node) {
[node applyPendingLayoutContext]; [node applyPendingLayoutContext];
@@ -749,9 +742,7 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c)
_pendingLayoutTransition = [[ASLayoutTransition alloc] initWithNode:self _pendingLayoutTransition = [[ASLayoutTransition alloc] initWithNode:self
pendingLayout:newLayout pendingLayout:newLayout
pendingConstrainedSize:constrainedSize previousLayout:previousLayout];
previousLayout:previousLayout
previousConstrainedSize:previousConstrainedSize];
[_pendingLayoutTransition applySubnodeInsertions]; [_pendingLayoutTransition applySubnodeInsertions];
_transitionContext = [[_ASTransitionContext alloc] initWithAnimation:animated _transitionContext = [[_ASTransitionContext alloc] initWithAnimation:animated
@@ -1032,7 +1023,6 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c)
return; return;
} }
ASSizeRange oldConstrainedSize = _constrainedSize;
[self invalidateCalculatedLayout]; [self invalidateCalculatedLayout];
if (_supernode) { if (_supernode) {
@@ -1045,7 +1035,7 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c)
} }
// This is the root node. Trigger a full measurement pass on *current* thread. Old constrained size is re-used. // This is the root node. Trigger a full measurement pass on *current* thread. Old constrained size is re-used.
[self measureWithSizeRange:oldConstrainedSize]; [self measureWithSizeRange:_layout.constrainedSizeRange];
CGRect oldBounds = self.bounds; CGRect oldBounds = self.bounds;
CGSize oldSize = oldBounds.size; CGSize oldSize = oldBounds.size;
@@ -2014,7 +2004,7 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock)
- (ASSizeRange)constrainedSizeForCalculatedLayout - (ASSizeRange)constrainedSizeForCalculatedLayout
{ {
ASDN::MutexLocker l(_propertyLock); ASDN::MutexLocker l(_propertyLock);
return _constrainedSize; return _layout.constrainedSizeRange;
} }
- (void)setLayoutSpecBlock:(ASLayoutSpecBlock)layoutSpecBlock - (void)setLayoutSpecBlock:(ASLayoutSpecBlock)layoutSpecBlock
@@ -2400,15 +2390,12 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock)
{ {
ASDN::MutexLocker l(_propertyLock); ASDN::MutexLocker l(_propertyLock);
if (_pendingLayoutTransition) { if (_pendingLayoutTransition) {
[self applyLayout:_pendingLayoutTransition.pendingLayout [self applyLayout:_pendingLayoutTransition.pendingLayout layoutContext:_pendingLayoutTransition];
constrainedSize:_pendingLayoutTransition.pendingConstrainedSize
layoutContext:_pendingLayoutTransition];
_pendingLayoutTransition = nil; _pendingLayoutTransition = nil;
} }
} }
- (void)applyLayout:(ASLayout *)layout - (void)applyLayout:(ASLayout *)layout
constrainedSize:(ASSizeRange)constrainedSize
layoutContext:(ASLayoutTransition *)layoutContext layoutContext:(ASLayoutTransition *)layoutContext
{ {
ASDN::MutexLocker l(_propertyLock); ASDN::MutexLocker l(_propertyLock);
@@ -2418,7 +2405,6 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock)
ASDisplayNodeAssertTrue(layout.size.width >= 0.0); ASDisplayNodeAssertTrue(layout.size.width >= 0.0);
ASDisplayNodeAssertTrue(layout.size.height >= 0.0); ASDisplayNodeAssertTrue(layout.size.height >= 0.0);
_constrainedSize = constrainedSize;
_flags.isMeasured = YES; _flags.isMeasured = YES;
if (self.usesImplicitHierarchyManagement && layoutContext != nil) { if (self.usesImplicitHierarchyManagement && layoutContext != nil) {

View File

@@ -103,8 +103,6 @@ FOUNDATION_EXPORT NSString * const ASRenderingEngineDidDisplayNodesScheduledBefo
ASEnvironmentState _environmentState; ASEnvironmentState _environmentState;
ASLayout *_layout; ASLayout *_layout;
ASSizeRange _constrainedSize;
UIEdgeInsets _hitTestSlop; UIEdgeInsets _hitTestSlop;
NSMutableArray *_subnodes; NSMutableArray *_subnodes;

View File

@@ -16,15 +16,11 @@
@property (nonatomic, readonly, weak) ASDisplayNode *node; @property (nonatomic, readonly, weak) ASDisplayNode *node;
@property (nonatomic, readonly, strong) ASLayout *pendingLayout; @property (nonatomic, readonly, strong) ASLayout *pendingLayout;
@property (nonatomic, readonly, assign) ASSizeRange pendingConstrainedSize;
@property (nonatomic, readonly, strong) ASLayout *previousLayout; @property (nonatomic, readonly, strong) ASLayout *previousLayout;
@property (nonatomic, readonly, assign) ASSizeRange previousConstrainedSize;
- (instancetype)initWithNode:(ASDisplayNode *)node - (instancetype)initWithNode:(ASDisplayNode *)node
pendingLayout:(ASLayout *)pendingLayout pendingLayout:(ASLayout *)pendingLayout
pendingConstrainedSize:(ASSizeRange)pendingConstrainedSize previousLayout:(ASLayout *)previousLayout;
previousLayout:(ASLayout *)previousLayout
previousConstrainedSize:(ASSizeRange)previousConstrainedSize;
- (void)applySubnodeInsertions; - (void)applySubnodeInsertions;

View File

@@ -29,17 +29,13 @@
- (instancetype)initWithNode:(ASDisplayNode *)node - (instancetype)initWithNode:(ASDisplayNode *)node
pendingLayout:(ASLayout *)pendingLayout pendingLayout:(ASLayout *)pendingLayout
pendingConstrainedSize:(ASSizeRange)pendingConstrainedSize
previousLayout:(ASLayout *)previousLayout previousLayout:(ASLayout *)previousLayout
previousConstrainedSize:(ASSizeRange)previousConstrainedSize
{ {
self = [super init]; self = [super init];
if (self) { if (self) {
_node = node; _node = node;
_pendingLayout = pendingLayout; _pendingLayout = pendingLayout;
_pendingConstrainedSize = pendingConstrainedSize;
_previousLayout = previousLayout; _previousLayout = previousLayout;
_previousConstrainedSize = previousConstrainedSize;
} }
return self; return self;
} }
@@ -129,9 +125,9 @@
{ {
ASDN::MutexLocker l(_propertyLock); ASDN::MutexLocker l(_propertyLock);
if ([key isEqualToString:ASTransitionContextFromLayoutKey]) { if ([key isEqualToString:ASTransitionContextFromLayoutKey]) {
return _previousConstrainedSize; return _previousLayout.constrainedSizeRange;
} else if ([key isEqualToString:ASTransitionContextToLayoutKey]) { } else if ([key isEqualToString:ASTransitionContextToLayoutKey]) {
return _pendingConstrainedSize; return _pendingLayout.constrainedSizeRange;
} else { } else {
return ASSizeRangeMake(CGSizeZero, CGSizeZero); return ASSizeRangeMake(CGSizeZero, CGSizeZero);
} }