diff --git a/AsyncDisplayKit.xcodeproj/project.pbxproj b/AsyncDisplayKit.xcodeproj/project.pbxproj index 24a82c91dc..a27689ce7c 100644 --- a/AsyncDisplayKit.xcodeproj/project.pbxproj +++ b/AsyncDisplayKit.xcodeproj/project.pbxproj @@ -580,8 +580,8 @@ E55D86331CA8A14000A0C26F /* ASLayoutable.mm in Sources */ = {isa = PBXBuildFile; fileRef = E55D86311CA8A14000A0C26F /* ASLayoutable.mm */; }; E5711A2B1C840C81009619D4 /* ASIndexedNodeContext.h in Headers */ = {isa = PBXBuildFile; fileRef = E5711A2A1C840C81009619D4 /* ASIndexedNodeContext.h */; settings = {ATTRIBUTES = (Public, ); }; }; E5711A2C1C840C81009619D4 /* ASIndexedNodeContext.h in Headers */ = {isa = PBXBuildFile; fileRef = E5711A2A1C840C81009619D4 /* ASIndexedNodeContext.h */; }; - E5711A2E1C840C96009619D4 /* ASIndexedNodeContext.m in Sources */ = {isa = PBXBuildFile; fileRef = E5711A2D1C840C96009619D4 /* ASIndexedNodeContext.m */; }; - E5711A301C840C96009619D4 /* ASIndexedNodeContext.m in Sources */ = {isa = PBXBuildFile; fileRef = E5711A2D1C840C96009619D4 /* ASIndexedNodeContext.m */; }; + E5711A2E1C840C96009619D4 /* ASIndexedNodeContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = E5711A2D1C840C96009619D4 /* ASIndexedNodeContext.mm */; }; + E5711A301C840C96009619D4 /* ASIndexedNodeContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = E5711A2D1C840C96009619D4 /* ASIndexedNodeContext.mm */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -940,7 +940,7 @@ E52405B41C8FEF16004DC8E7 /* ASDisplayNodeLayoutContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASDisplayNodeLayoutContext.h; sourceTree = ""; }; E55D86311CA8A14000A0C26F /* ASLayoutable.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = ASLayoutable.mm; path = AsyncDisplayKit/Layout/ASLayoutable.mm; sourceTree = ""; }; E5711A2A1C840C81009619D4 /* ASIndexedNodeContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ASIndexedNodeContext.h; sourceTree = ""; }; - E5711A2D1C840C96009619D4 /* ASIndexedNodeContext.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ASIndexedNodeContext.m; sourceTree = ""; }; + E5711A2D1C840C96009619D4 /* ASIndexedNodeContext.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ASIndexedNodeContext.mm; sourceTree = ""; }; EFA731F0396842FF8AB635EE /* libPods-AsyncDisplayKitTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-AsyncDisplayKitTests.a"; sourceTree = BUILT_PRODUCTS_DIR; }; FB07EABBCF28656C6297BC2D /* Pods-AsyncDisplayKitTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-AsyncDisplayKitTests.debug.xcconfig"; path = "Pods/Target Support Files/Pods-AsyncDisplayKitTests/Pods-AsyncDisplayKitTests.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -1397,7 +1397,7 @@ AC026B671BD57D6F00BBC17E /* ASChangeSetDataController.h */, AC026B681BD57D6F00BBC17E /* ASChangeSetDataController.m */, E5711A2A1C840C81009619D4 /* ASIndexedNodeContext.h */, - E5711A2D1C840C96009619D4 /* ASIndexedNodeContext.m */, + E5711A2D1C840C96009619D4 /* ASIndexedNodeContext.mm */, ); name = "Data Controller"; sourceTree = ""; @@ -2088,7 +2088,7 @@ 205F0E121B371BD7007741D0 /* ASScrollDirection.m in Sources */, 9C8898BB1C738B9800D6B02E /* ASTextKitFontSizeAdjuster.mm in Sources */, D785F6631A74327E00291744 /* ASScrollNode.m in Sources */, - E5711A2E1C840C96009619D4 /* ASIndexedNodeContext.m in Sources */, + E5711A2E1C840C96009619D4 /* ASIndexedNodeContext.mm in Sources */, 058D0A2C195D050800B7D73C /* ASSentinel.m in Sources */, 9C8221971BA237B80037F19A /* ASStackBaselinePositionedLayout.mm in Sources */, 251B8EF81BBB3D690087C538 /* ASCollectionDataController.mm in Sources */, @@ -2213,7 +2213,7 @@ 69E100701CA89CB600D88C1B /* ASEnvironmentInternal.mm in Sources */, 254C6B891BF94F8A003EC431 /* ASTextKitRenderer+Positioning.mm in Sources */, 68355B341CB579B9001D4E68 /* ASImageNode+AnimatedImage.mm in Sources */, - E5711A301C840C96009619D4 /* ASIndexedNodeContext.m in Sources */, + E5711A301C840C96009619D4 /* ASIndexedNodeContext.mm in Sources */, B35062511B010EFD0018CF92 /* ASDisplayNode+UIViewBridge.mm in Sources */, B35061FC1B010EFD0018CF92 /* ASDisplayNode.mm in Sources */, B35061FF1B010EFD0018CF92 /* ASDisplayNodeExtras.mm in Sources */, diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 2a1c59067b..4834eabb00 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -1248,9 +1248,6 @@ static bool disableNotificationsForMovingBetweenParents(ASDisplayNode *from, ASD // This call will apply our .hierarchyState to the new subnode. // If we are a managed hierarchy, as in ASCellNode trees, it will also apply our .interfaceState. [subnode __setSupernode:self]; - - // propagate our traits to the child we are about to add. - ASEnvironmentStatePropagateDown(subnode, [self environmentTraitCollection]); if (self.nodeLoaded) { // If this node has a view or layer, force the subnode to also create its view or layer and add it to the hierarchy here. @@ -1298,9 +1295,6 @@ static bool disableNotificationsForMovingBetweenParents(ASDisplayNode *from, ASD [_subnodes insertObject:subnode atIndex:subnodeIndex]; [subnode __setSupernode:self]; - // propagate our traits to the child we are about to add. - ASEnvironmentStatePropagateDown(subnode, [self environmentTraitCollection]); - // Don't bother inserting the view/layer if in a rasterized subtree, because there are no layers in the hierarchy and none of this could possibly work. if (!_flags.shouldRasterizeDescendants && [self __shouldLoadViewOrLayer]) { if (_layer) { @@ -1742,6 +1736,9 @@ static NSInteger incrementIfFound(NSInteger i) { [self exitHierarchyState:stateToEnterOrExit]; } + + // now that we have a supernode, propagate its traits to self. + ASEnvironmentStatePropagateDown(self, [newSupernode environmentTraitCollection]); } } @@ -2725,12 +2722,12 @@ static const char *ASDisplayNodeDrawingPriorityKey = "ASDrawingPriority"; - (ASEnvironmentTraitCollection)environmentTraitCollection { - return _environmentState.traitCollection; + return _environmentState.environmentTraitCollection; } - (void)setEnvironmentTraitCollection:(ASEnvironmentTraitCollection)environmentTraitCollection { - _environmentState.traitCollection = environmentTraitCollection; + _environmentState.environmentTraitCollection = environmentTraitCollection; } ASEnvironmentLayoutOptionsForwarding @@ -2739,7 +2736,7 @@ ASEnvironmentLayoutExtensibilityForwarding - (ASTraitCollection *)asyncTraitCollection { ASDN::MutexLocker l(_propertyLock); - return [ASTraitCollection traitCollectionWithASEnvironmentTraitCollection:_environmentState.traitCollection]; + return [ASTraitCollection traitCollectionWithASEnvironmentTraitCollection:self.environmentTraitCollection]; } #if TARGET_OS_TV diff --git a/AsyncDisplayKit/ASViewController.mm b/AsyncDisplayKit/ASViewController.mm index 1aef39231e..14f71850a5 100644 --- a/AsyncDisplayKit/ASViewController.mm +++ b/AsyncDisplayKit/ASViewController.mm @@ -61,7 +61,7 @@ // Since the VC holds the only strong reference to this context and we are in the process of destroying // the VC, all the references in the subnodes will be unsafe unless we nil them out. More than likely all the subnodes will be dealloc'ed // as part of the VC being dealloc'ed, but this is just to make extra sure. - self.traitColectionContext = nil; + self.traitCollectionContext = nil; } } @@ -87,8 +87,8 @@ // ensure that self.node has a valid trait collection before a subclass's implementation of viewDidLoad. // Any subnodes added in viewDidLoad will then inherit the proper environment. if (AS_AT_LEAST_IOS8) { - ASEnvironmentTraitCollection traitCollection = [self displayTraitsForTraitCollection:self.traitCollection]; - [self progagateNewDisplayTraits:traitCollection]; + ASEnvironmentTraitCollection traitCollection = [self environmentTraitCollectionForUITraitCollection:self.traitCollection]; + [self progagateNewEnvironmentTraitCollection:traitCollection]; } } @@ -195,7 +195,7 @@ ASVisibilityDepthImplementation; #pragma mark - ASEnvironmentTraitCollection -- (void)setTraitColectionContext:(id)traitCollectionContext +- (void)setTraitCollectionContext:(id)traitCollectionContext { if (_traitCollectionContext != traitCollectionContext) { // nil out the displayContext in the subnodes so they aren't hanging around with a dealloc'ed pointer don't set @@ -206,11 +206,11 @@ ASVisibilityDepthImplementation; } } -- (ASEnvironmentTraitCollection)displayTraitsForTraitCollection:(UITraitCollection *)traitCollection +- (ASEnvironmentTraitCollection)environmentTraitCollectionForUITraitCollection:(UITraitCollection *)traitCollection { if (self.overrideDisplayTraitsWithTraitCollection) { ASTraitCollection *asyncTraitCollection = self.overrideDisplayTraitsWithTraitCollection(traitCollection); - self.traitColectionContext = asyncTraitCollection.traitCollectionContext; + self.traitCollectionContext = asyncTraitCollection.traitCollectionContext; return [asyncTraitCollection environmentTraitCollection]; } @@ -219,29 +219,29 @@ ASVisibilityDepthImplementation; return asyncTraitCollection; } -- (ASEnvironmentTraitCollection)displayTraitsForWindowSize:(CGSize)windowSize +- (ASEnvironmentTraitCollection)environmentTraitCollectionForWindowSize:(CGSize)windowSize { if (self.overrideDisplayTraitsWithWindowSize) { ASTraitCollection *traitCollection = self.overrideDisplayTraitsWithWindowSize(windowSize); - self.traitColectionContext = traitCollection.traitCollectionContext; + self.traitCollectionContext = traitCollection.traitCollectionContext; return [traitCollection environmentTraitCollection]; } return self.node.environmentTraitCollection; } -- (void)progagateNewDisplayTraits:(ASEnvironmentTraitCollection)traitCollection +- (void)progagateNewEnvironmentTraitCollection:(ASEnvironmentTraitCollection)environmentTraitCollection { ASEnvironmentState environmentState = self.node.environmentState; - ASEnvironmentTraitCollection oldTraitCollection = environmentState.traitCollection; + ASEnvironmentTraitCollection oldEnvironmentTraitCollection = environmentState.environmentTraitCollection; - if (ASEnvironmentTraitCollectionIsEqualToASEnvironmentTraitCollection(traitCollection, oldTraitCollection) == NO) { - environmentState.traitCollection = traitCollection; + if (ASEnvironmentTraitCollectionIsEqualToASEnvironmentTraitCollection(environmentTraitCollection, oldEnvironmentTraitCollection) == NO) { + environmentState.environmentTraitCollection = environmentTraitCollection; self.node.environmentState = environmentState; [self.node setNeedsLayout]; NSArray> *children = [self.node children]; for (id child in children) { - ASEnvironmentStatePropagateDown(child, environmentState.traitCollection); + ASEnvironmentStatePropagateDown(child, environmentState.environmentTraitCollection); } } } @@ -250,24 +250,24 @@ ASVisibilityDepthImplementation; { [super traitCollectionDidChange:previousTraitCollection]; - ASEnvironmentTraitCollection traitCollection = [self displayTraitsForTraitCollection:self.traitCollection]; - [self progagateNewDisplayTraits:traitCollection]; + ASEnvironmentTraitCollection environmentTraitCollection = [self environmentTraitCollectionForUITraitCollection:self.traitCollection]; + [self progagateNewEnvironmentTraitCollection:environmentTraitCollection]; } - (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id)coordinator { [super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator]; - ASEnvironmentTraitCollection traitCollection = [self displayTraitsForTraitCollection:newCollection]; - [self progagateNewDisplayTraits:traitCollection]; + ASEnvironmentTraitCollection environmentTraitCollection = [self environmentTraitCollectionForUITraitCollection:newCollection]; + [self progagateNewEnvironmentTraitCollection:environmentTraitCollection]; } - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id)coordinator { [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; - ASEnvironmentTraitCollection traitCollection = [self displayTraitsForWindowSize:size]; - [self progagateNewDisplayTraits:traitCollection]; + ASEnvironmentTraitCollection environmentTraitCollection = [self environmentTraitCollectionForWindowSize:size]; + [self progagateNewEnvironmentTraitCollection:environmentTraitCollection]; } @end diff --git a/AsyncDisplayKit/Details/ASCollectionDataController.mm b/AsyncDisplayKit/Details/ASCollectionDataController.mm index ba1647a282..3a51eed154 100644 --- a/AsyncDisplayKit/Details/ASCollectionDataController.mm +++ b/AsyncDisplayKit/Details/ASCollectionDataController.mm @@ -158,6 +158,9 @@ - (void)_populateSupplementaryNodesOfKind:(NSString *)kind withMutableContexts:(NSMutableArray *)contexts { + id environment = [self.environmentDelegate dataControllerEnvironment]; + ASEnvironmentTraitCollection environmentTraitCollection = environment.environmentTraitCollection; + NSUInteger sectionCount = [self.collectionDataSource dataController:self numberOfSectionsForSupplementaryNodeOfKind:kind]; for (NSUInteger i = 0; i < sectionCount; i++) { NSIndexPath *sectionIndexPath = [[NSIndexPath alloc] initWithIndex:i]; @@ -176,7 +179,8 @@ ASSizeRange constrainedSize = [self constrainedSizeForNodeOfKind:kind atIndexPath:indexPath]; ASIndexedNodeContext *context = [[ASIndexedNodeContext alloc] initWithNodeBlock:supplementaryCellBlock indexPath:indexPath - constrainedSize:constrainedSize]; + constrainedSize:constrainedSize + environmentTraitCollection:environmentTraitCollection]; [contexts addObject:context]; } } @@ -184,6 +188,9 @@ - (void)_populateSupplementaryNodesOfKind:(NSString *)kind withSections:(NSIndexSet *)sections mutableContexts:(NSMutableArray *)contexts { + id environment = [self.environmentDelegate dataControllerEnvironment]; + ASEnvironmentTraitCollection environmentTraitCollection = environment.environmentTraitCollection; + [sections enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { NSUInteger rowNum = [self.collectionDataSource dataController:self supplementaryNodesOfKind:kind inSection:idx]; NSIndexPath *sectionIndex = [[NSIndexPath alloc] initWithIndex:idx]; @@ -201,7 +208,8 @@ ASSizeRange constrainedSize = [self constrainedSizeForNodeOfKind:kind atIndexPath:indexPath]; ASIndexedNodeContext *context = [[ASIndexedNodeContext alloc] initWithNodeBlock:supplementaryCellBlock indexPath:indexPath - constrainedSize:constrainedSize]; + constrainedSize:constrainedSize + environmentTraitCollection:environmentTraitCollection]; [contexts addObject:context]; } }]; diff --git a/AsyncDisplayKit/Details/ASDataController.mm b/AsyncDisplayKit/Details/ASDataController.mm index f3fcb922bf..44719f8652 100644 --- a/AsyncDisplayKit/Details/ASDataController.mm +++ b/AsyncDisplayKit/Details/ASDataController.mm @@ -514,22 +514,14 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; } } -- (ASCellNodeBlock)nodeBlockPropagatingTraitCollectionFromNodeBlock:(ASCellNodeBlock)nodeBlock -{ - // When creating a node, make sure to pass along the current display traits so it will be laid out properly - return ^{ - ASCellNode *cellNode = nodeBlock(); - id environment = [self.environmentDelegate dataControllerEnvironment]; - ASEnvironmentStatePropagateDown(cellNode, [environment environmentTraitCollection]); - return cellNode; - }; -} - /** * Fetches row contexts for the provided sections from the data source. */ - (NSArray *)_populateFromDataSourceWithSectionIndexSet:(NSIndexSet *)indexSet { + id environment = [self.environmentDelegate dataControllerEnvironment]; + ASEnvironmentTraitCollection environmentTraitCollection = environment.environmentTraitCollection; + NSMutableArray *contexts = [NSMutableArray array]; [indexSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) { NSUInteger rowNum = [_dataSource dataController:self rowsInSection:idx]; @@ -539,9 +531,10 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; ASCellNodeBlock nodeBlock = [_dataSource dataController:self nodeBlockAtIndexPath:indexPath]; ASSizeRange constrainedSize = [self constrainedSizeForNodeOfKind:ASDataControllerRowNodeKind atIndexPath:indexPath]; - [contexts addObject:[[ASIndexedNodeContext alloc] initWithNodeBlock:[self nodeBlockPropagatingTraitCollectionFromNodeBlock:nodeBlock] + [contexts addObject:[[ASIndexedNodeContext alloc] initWithNodeBlock:nodeBlock indexPath:indexPath - constrainedSize:constrainedSize]]; + constrainedSize:constrainedSize + environmentTraitCollection:environmentTraitCollection]]; } }]; return contexts; @@ -794,12 +787,16 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; NSMutableArray *contexts = [[NSMutableArray alloc] initWithCapacity:indexPaths.count]; [self accessDataSourceWithBlock:^{ + id environment = [self.environmentDelegate dataControllerEnvironment]; + ASEnvironmentTraitCollection environmentTraitCollection = environment.environmentTraitCollection; + for (NSIndexPath *indexPath in sortedIndexPaths) { ASCellNodeBlock nodeBlock = [_dataSource dataController:self nodeBlockAtIndexPath:indexPath]; ASSizeRange constrainedSize = [self constrainedSizeForNodeOfKind:ASDataControllerRowNodeKind atIndexPath:indexPath]; - [contexts addObject:[[ASIndexedNodeContext alloc] initWithNodeBlock:[self nodeBlockPropagatingTraitCollectionFromNodeBlock:nodeBlock] + [contexts addObject:[[ASIndexedNodeContext alloc] initWithNodeBlock:nodeBlock indexPath:indexPath - constrainedSize:constrainedSize]]; + constrainedSize:constrainedSize + environmentTraitCollection:environmentTraitCollection]]; } [_editingTransactionQueue addOperationWithBlock:^{ @@ -845,12 +842,16 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; // FIXME: Shouldn't deletes be sorted in descending order? [indexPaths sortedArrayUsingSelector:@selector(compare:)]; + id environment = [self.environmentDelegate dataControllerEnvironment]; + ASEnvironmentTraitCollection environmentTraitCollection = environment.environmentTraitCollection; + for (NSIndexPath *indexPath in indexPaths) { ASCellNodeBlock nodeBlock = [_dataSource dataController:self nodeBlockAtIndexPath:indexPath]; ASSizeRange constrainedSize = [self constrainedSizeForNodeOfKind:ASDataControllerRowNodeKind atIndexPath:indexPath]; - [contexts addObject:[[ASIndexedNodeContext alloc] initWithNodeBlock:[self nodeBlockPropagatingTraitCollectionFromNodeBlock:nodeBlock] + [contexts addObject:[[ASIndexedNodeContext alloc] initWithNodeBlock:nodeBlock indexPath:indexPath - constrainedSize:constrainedSize]]; + constrainedSize:constrainedSize + environmentTraitCollection:environmentTraitCollection]]; } [_editingTransactionQueue addOperationWithBlock:^{ diff --git a/AsyncDisplayKit/Details/ASEnvironment.h b/AsyncDisplayKit/Details/ASEnvironment.h index 6282d1dc60..5e0233a702 100644 --- a/AsyncDisplayKit/Details/ASEnvironment.h +++ b/AsyncDisplayKit/Details/ASEnvironment.h @@ -97,7 +97,7 @@ extern BOOL ASEnvironmentTraitCollectionIsEqualToASEnvironmentTraitCollection(AS typedef struct ASEnvironmentState { struct ASEnvironmentHierarchyState hierarchyState; struct ASEnvironmentLayoutOptionsState layoutOptionsState; - struct ASEnvironmentTraitCollection traitCollection; + struct ASEnvironmentTraitCollection environmentTraitCollection; } ASEnvironmentState; extern ASEnvironmentState ASEnvironmentStateMakeDefault(); @@ -152,9 +152,9 @@ ASDISPLAYNODE_EXTERN_C_END - (void)setEnvironmentState:(ASEnvironmentState)environmentState\ {\ ASDN::MutexLocker l(lock);\ - ASEnvironmentTraitCollection oldTraits = self.environmentState.traitCollection;\ + ASEnvironmentTraitCollection oldTraits = self.environmentState.environmentTraitCollection;\ [super setEnvironmentState:environmentState];\ - ASEnvironmentTraitCollection currentTraits = environmentState.traitCollection;\ + ASEnvironmentTraitCollection currentTraits = environmentState.environmentTraitCollection;\ if (ASEnvironmentTraitCollectionIsEqualToASEnvironmentTraitCollection(currentTraits, oldTraits) == NO) {\ dispatch_async(dispatch_get_main_queue(), ^{\ NSArray *> *completedNodes = [self.view.dataController completedNodes];\ diff --git a/AsyncDisplayKit/Details/ASEnvironment.mm b/AsyncDisplayKit/Details/ASEnvironment.mm index b1e17e95fa..be7c627c20 100644 --- a/AsyncDisplayKit/Details/ASEnvironment.mm +++ b/AsyncDisplayKit/Details/ASEnvironment.mm @@ -29,13 +29,13 @@ ASEnvironmentHierarchyState _ASEnvironmentHierarchyStateMakeDefault() extern void ASEnvironmentTraitCollectionUpdateDisplayContext(id rootEnvironment, id context) { ASEnvironmentState envState = [rootEnvironment environmentState]; - ASEnvironmentTraitCollection displayTraits = envState.traitCollection; - displayTraits.displayContext = context; - envState.traitCollection = displayTraits; + ASEnvironmentTraitCollection environmentTraitCollection = envState.environmentTraitCollection; + environmentTraitCollection.displayContext = context; + envState.environmentTraitCollection = environmentTraitCollection; [rootEnvironment setEnvironmentState:envState]; for (id child in [rootEnvironment children]) { - ASEnvironmentStatePropagateDown(child, displayTraits); + ASEnvironmentStatePropagateDown(child, environmentTraitCollection); } } @@ -77,7 +77,7 @@ ASEnvironmentState ASEnvironmentStateMakeDefault() return (ASEnvironmentState) { .layoutOptionsState = _ASEnvironmentLayoutOptionsStateMakeDefault(), .hierarchyState = _ASEnvironmentHierarchyStateMakeDefault(), - .traitCollection = _ASEnvironmentTraitCollectionMakeDefault() + .environmentTraitCollection = _ASEnvironmentTraitCollectionMakeDefault() }; } diff --git a/AsyncDisplayKit/Details/ASIndexedNodeContext.h b/AsyncDisplayKit/Details/ASIndexedNodeContext.h index ed1d2f49ba..0dd90d51c1 100644 --- a/AsyncDisplayKit/Details/ASIndexedNodeContext.h +++ b/AsyncDisplayKit/Details/ASIndexedNodeContext.h @@ -7,15 +7,18 @@ // #import +#import @interface ASIndexedNodeContext : NSObject @property (nonatomic, readonly, strong) NSIndexPath *indexPath; @property (nonatomic, readonly, assign) ASSizeRange constrainedSize; +@property (nonatomic, readonly, assign) ASEnvironmentTraitCollection environmentTraitCollection; - (instancetype)initWithNodeBlock:(ASCellNodeBlock)nodeBlock indexPath:(NSIndexPath *)indexPath - constrainedSize:(ASSizeRange)constrainedSize; + constrainedSize:(ASSizeRange)constrainedSize + environmentTraitCollection:(ASEnvironmentTraitCollection)environmentTraitCollection; /** * Returns a node allocated by executing node block. Node block will be nil out immediately. diff --git a/AsyncDisplayKit/Details/ASIndexedNodeContext.m b/AsyncDisplayKit/Details/ASIndexedNodeContext.mm similarity index 74% rename from AsyncDisplayKit/Details/ASIndexedNodeContext.m rename to AsyncDisplayKit/Details/ASIndexedNodeContext.mm index b6038137d6..e296a84a4c 100644 --- a/AsyncDisplayKit/Details/ASIndexedNodeContext.m +++ b/AsyncDisplayKit/Details/ASIndexedNodeContext.mm @@ -7,6 +7,8 @@ // #import "ASIndexedNodeContext.h" +#import "ASEnvironmentInternal.h" +#import "ASCellNode.h" @interface ASIndexedNodeContext () @@ -19,7 +21,8 @@ - (instancetype)initWithNodeBlock:(ASCellNodeBlock)nodeBlock indexPath:(NSIndexPath *)indexPath - constrainedSize:(ASSizeRange)constrainedSize; + constrainedSize:(ASSizeRange)constrainedSize + environmentTraitCollection:(ASEnvironmentTraitCollection)environmentTraitCollection { NSAssert(nodeBlock != nil && indexPath != nil, @"Node block and index path must not be nil"); self = [super init]; @@ -27,6 +30,7 @@ _nodeBlock = nodeBlock; _indexPath = indexPath; _constrainedSize = constrainedSize; + _environmentTraitCollection = environmentTraitCollection; } return self; } @@ -36,6 +40,7 @@ NSAssert(_nodeBlock != nil, @"Node block is gone. Should not execute it more than once"); ASCellNode *node = _nodeBlock(); _nodeBlock = nil; + ASEnvironmentStatePropagateDown(node, _environmentTraitCollection); return node; } diff --git a/AsyncDisplayKit/Details/ASTraitCollection.h b/AsyncDisplayKit/Details/ASTraitCollection.h index 5d6118cab4..e9b99ef4fd 100644 --- a/AsyncDisplayKit/Details/ASTraitCollection.h +++ b/AsyncDisplayKit/Details/ASTraitCollection.h @@ -28,7 +28,7 @@ * Be aware that internally this context is held by a C struct which cannot retain the pointer. * ASTraitCollection is generally a very short-lived class, existing only to provide a non-struct API * to trait collections. When an ASTraitCollection is returned via one of ASViewController's 2 - * custom trait collection creation blocks, traitColectionContext is assigned to the VC's traitColectionContext. + * custom trait collection creation blocks, traitCollectionContext is assigned to the VC's traitCollectionContext. * This makes sure that the VC is the owner of the context and ASEnvironmentTraitCollections will not * have a reference to a dangling pointer. */ diff --git a/AsyncDisplayKit/Layout/ASLayoutSpec.mm b/AsyncDisplayKit/Layout/ASLayoutSpec.mm index ca4dba8008..79194fa7a1 100644 --- a/AsyncDisplayKit/Layout/ASLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASLayoutSpec.mm @@ -214,12 +214,12 @@ - (ASEnvironmentTraitCollection)environmentTraitCollection { - return _environmentState.traitCollection; + return _environmentState.environmentTraitCollection; } -- (void)setEnvironmentTraitCollection:(ASEnvironmentTraitCollection)traitCollection +- (void)setEnvironmentTraitCollection:(ASEnvironmentTraitCollection)environmentTraitCollection { - _environmentState.traitCollection = traitCollection; + _environmentState.environmentTraitCollection = environmentTraitCollection; } ASEnvironmentLayoutOptionsForwarding @@ -228,7 +228,7 @@ ASEnvironmentLayoutExtensibilityForwarding - (ASTraitCollection *)asyncTraitCollection { ASDN::MutexLocker l(_propertyLock); - return [ASTraitCollection traitCollectionWithASEnvironmentTraitCollection:_environmentState.traitCollection]; + return [ASTraitCollection traitCollectionWithASEnvironmentTraitCollection:self.environmentTraitCollection]; } @end diff --git a/AsyncDisplayKit/Private/ASEnvironmentInternal.mm b/AsyncDisplayKit/Private/ASEnvironmentInternal.mm index e74e0abf60..af856b970d 100644 --- a/AsyncDisplayKit/Private/ASEnvironmentInternal.mm +++ b/AsyncDisplayKit/Private/ASEnvironmentInternal.mm @@ -201,14 +201,14 @@ ASEnvironmentState ASEnvironmentMergeObjectAndState(ASEnvironmentState childEnvi // Support propagate down if (propagation == ASEnvironmentStatePropagation::DOWN) { - ASEnvironmentTraitCollection childTraitCollection = childEnvironmentState.traitCollection; + ASEnvironmentTraitCollection childTraitCollection = childEnvironmentState.environmentTraitCollection; childTraitCollection.horizontalSizeClass = parentTraitCollection.horizontalSizeClass; childTraitCollection.verticalSizeClass = parentTraitCollection.verticalSizeClass; childTraitCollection.userInterfaceIdiom = parentTraitCollection.userInterfaceIdiom; childTraitCollection.forceTouchCapability = parentTraitCollection.forceTouchCapability; childTraitCollection.displayScale = parentTraitCollection.displayScale; childTraitCollection.displayContext = parentTraitCollection.displayContext; - childEnvironmentState.traitCollection = childTraitCollection; + childEnvironmentState.environmentTraitCollection = childTraitCollection; } return childEnvironmentState;