From 59a26ee1116e17324137795a6b16a559a888a292 Mon Sep 17 00:00:00 2001 From: ricky Date: Mon, 23 May 2016 16:37:40 -0700 Subject: [PATCH 01/10] [ASTraitCollection] Bug fixing/LayoutSpec propagation * Fixed bug in `ASEnvironmentMergeObjectAndState` * New ASLayoutSpec methods for `setChild`/`setChildren`/`setChild:forIdentifier:` have been added to take in a trait collection. * Added `setChild:`-like methods for ASLayoutSpecs take a traitCollection * Fixed instances where nodes in a data controller were not getting their trait collections * propagate traitCollection in ASDisplayNode on insertSubnode or addSubnode --- AsyncDisplayKit/ASDisplayNode.mm | 13 +- AsyncDisplayKit/ASViewController.mm | 8 + AsyncDisplayKit/Details/ASDataController.mm | 25 +- AsyncDisplayKit/Details/ASEnvironment.h | 16 +- .../Layout/ASBackgroundLayoutSpec.h | 3 + .../Layout/ASBackgroundLayoutSpec.mm | 28 +- AsyncDisplayKit/Layout/ASCenterLayoutSpec.h | 5 + AsyncDisplayKit/Layout/ASCenterLayoutSpec.mm | 15 +- AsyncDisplayKit/Layout/ASInsetLayoutSpec.h | 1 + AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm | 14 +- AsyncDisplayKit/Layout/ASLayoutSpec.h | 3 + AsyncDisplayKit/Layout/ASLayoutSpec.mm | 26 +- AsyncDisplayKit/Layout/ASOverlayLayoutSpec.h | 3 + AsyncDisplayKit/Layout/ASOverlayLayoutSpec.mm | 28 +- AsyncDisplayKit/Layout/ASRatioLayoutSpec.h | 1 + AsyncDisplayKit/Layout/ASRatioLayoutSpec.mm | 20 +- AsyncDisplayKit/Layout/ASRelativeLayoutSpec.h | 9 +- .../Layout/ASRelativeLayoutSpec.mm | 27 +- AsyncDisplayKit/Layout/ASStackLayoutSpec.h | 13 +- AsyncDisplayKit/Layout/ASStackLayoutSpec.mm | 31 +- AsyncDisplayKit/Layout/ASStaticLayoutSpec.h | 1 + AsyncDisplayKit/Layout/ASStaticLayoutSpec.mm | 15 +- .../Private/ASEnvironmentInternal.h | 4 +- examples/ASTraitCollection/Podfile | 5 + .../Sample.xcodeproj/project.pbxproj | 385 ++++++++++++++++++ .../contents.xcworkspacedata | 7 + .../xcshareddata/xcschemes/Sample.xcscheme | 88 ++++ .../contents.xcworkspacedata | 10 + .../ASTraitCollection/Sample/AppDelegate.h | 20 + .../ASTraitCollection/Sample/AppDelegate.m | 31 ++ .../Sample/CollectionViewController.h | 15 + .../Sample/CollectionViewController.m | 73 ++++ examples/ASTraitCollection/Sample/Info.plist | 39 ++ .../ASTraitCollection/Sample/KittenNode.h | 23 ++ .../ASTraitCollection/Sample/KittenNode.m | 170 ++++++++ .../Sample/Launch Screen.storyboard | 50 +++ .../Sample/OverrideViewController.h | 29 ++ .../Sample/OverrideViewController.m | 97 +++++ .../Sample/TableViewController.h | 16 + .../Sample/TableViewController.m | 62 +++ .../ASTraitCollection/Sample/ViewController.h | 16 + .../ASTraitCollection/Sample/ViewController.m | 45 ++ examples/ASTraitCollection/Sample/main.m | 20 + 43 files changed, 1430 insertions(+), 80 deletions(-) create mode 100644 examples/ASTraitCollection/Podfile create mode 100644 examples/ASTraitCollection/Sample.xcodeproj/project.pbxproj create mode 100644 examples/ASTraitCollection/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 examples/ASTraitCollection/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme create mode 100644 examples/ASTraitCollection/Sample.xcworkspace/contents.xcworkspacedata create mode 100644 examples/ASTraitCollection/Sample/AppDelegate.h create mode 100644 examples/ASTraitCollection/Sample/AppDelegate.m create mode 100644 examples/ASTraitCollection/Sample/CollectionViewController.h create mode 100644 examples/ASTraitCollection/Sample/CollectionViewController.m create mode 100644 examples/ASTraitCollection/Sample/Info.plist create mode 100644 examples/ASTraitCollection/Sample/KittenNode.h create mode 100644 examples/ASTraitCollection/Sample/KittenNode.m create mode 100644 examples/ASTraitCollection/Sample/Launch Screen.storyboard create mode 100644 examples/ASTraitCollection/Sample/OverrideViewController.h create mode 100644 examples/ASTraitCollection/Sample/OverrideViewController.m create mode 100644 examples/ASTraitCollection/Sample/TableViewController.h create mode 100644 examples/ASTraitCollection/Sample/TableViewController.m create mode 100644 examples/ASTraitCollection/Sample/ViewController.h create mode 100644 examples/ASTraitCollection/Sample/ViewController.m create mode 100644 examples/ASTraitCollection/Sample/main.m diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 06818906fe..0232c141f9 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -1249,6 +1249,9 @@ static bool disableNotificationsForMovingBetweenParents(ASDisplayNode *from, ASD // 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. // Otherwise there is no way for the subnode's view or layer to enter the hierarchy, except recursing down all @@ -1294,7 +1297,10 @@ static bool disableNotificationsForMovingBetweenParents(ASDisplayNode *from, ASD _subnodes = [[NSMutableArray alloc] init]; [_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) { @@ -2721,6 +2727,11 @@ static const char *ASDisplayNodeDrawingPriorityKey = "ASDrawingPriority"; return _environmentState.traitCollection; } +- (void)setEnvironmentTraitCollection:(ASEnvironmentTraitCollection)environmentTraitCollection +{ + _environmentState.traitCollection = environmentTraitCollection; +} + ASEnvironmentLayoutOptionsForwarding ASEnvironmentLayoutExtensibilityForwarding diff --git a/AsyncDisplayKit/ASViewController.mm b/AsyncDisplayKit/ASViewController.mm index 710016ccef..e575e9ec14 100644 --- a/AsyncDisplayKit/ASViewController.mm +++ b/AsyncDisplayKit/ASViewController.mm @@ -8,6 +8,7 @@ #import "ASViewController.h" #import "ASAssert.h" +#import "ASAvailability.h" #import "ASDimension.h" #import "ASDisplayNodeInternal.h" #import "ASDisplayNode+FrameworkPrivate.h" @@ -82,6 +83,13 @@ _node.frame = frame; _node.autoresizingMask = autoresizingMask; self.view = view; + + // 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]; + } } - (void)viewWillLayoutSubviews diff --git a/AsyncDisplayKit/Details/ASDataController.mm b/AsyncDisplayKit/Details/ASDataController.mm index 611dd1c5d3..f3fcb922bf 100644 --- a/AsyncDisplayKit/Details/ASDataController.mm +++ b/AsyncDisplayKit/Details/ASDataController.mm @@ -514,6 +514,17 @@ 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. */ @@ -527,16 +538,8 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; NSIndexPath *indexPath = [sectionIndex indexPathByAddingIndex:i]; ASCellNodeBlock nodeBlock = [_dataSource dataController:self nodeBlockAtIndexPath:indexPath]; - // When creating a node, make sure to pass along the current display traits so it will be laid out properly - ASCellNodeBlock nodeBlockPropagatingDisplayTraits = ^{ - ASCellNode *cellNode = nodeBlock(); - id environment = [self.environmentDelegate dataControllerEnvironment]; - ASEnvironmentStatePropagateDown(cellNode, [environment environmentTraitCollection]); - return cellNode; - }; - ASSizeRange constrainedSize = [self constrainedSizeForNodeOfKind:ASDataControllerRowNodeKind atIndexPath:indexPath]; - [contexts addObject:[[ASIndexedNodeContext alloc] initWithNodeBlock:nodeBlockPropagatingDisplayTraits + [contexts addObject:[[ASIndexedNodeContext alloc] initWithNodeBlock:[self nodeBlockPropagatingTraitCollectionFromNodeBlock:nodeBlock] indexPath:indexPath constrainedSize:constrainedSize]]; } @@ -794,7 +797,7 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; for (NSIndexPath *indexPath in sortedIndexPaths) { ASCellNodeBlock nodeBlock = [_dataSource dataController:self nodeBlockAtIndexPath:indexPath]; ASSizeRange constrainedSize = [self constrainedSizeForNodeOfKind:ASDataControllerRowNodeKind atIndexPath:indexPath]; - [contexts addObject:[[ASIndexedNodeContext alloc] initWithNodeBlock:nodeBlock + [contexts addObject:[[ASIndexedNodeContext alloc] initWithNodeBlock:[self nodeBlockPropagatingTraitCollectionFromNodeBlock:nodeBlock] indexPath:indexPath constrainedSize:constrainedSize]]; } @@ -845,7 +848,7 @@ static void *kASSizingQueueContext = &kASSizingQueueContext; for (NSIndexPath *indexPath in indexPaths) { ASCellNodeBlock nodeBlock = [_dataSource dataController:self nodeBlockAtIndexPath:indexPath]; ASSizeRange constrainedSize = [self constrainedSizeForNodeOfKind:ASDataControllerRowNodeKind atIndexPath:indexPath]; - [contexts addObject:[[ASIndexedNodeContext alloc] initWithNodeBlock:nodeBlock + [contexts addObject:[[ASIndexedNodeContext alloc] initWithNodeBlock:[self nodeBlockPropagatingTraitCollectionFromNodeBlock:nodeBlock] indexPath:indexPath constrainedSize:constrainedSize]]; } diff --git a/AsyncDisplayKit/Details/ASEnvironment.h b/AsyncDisplayKit/Details/ASEnvironment.h index 580c4a64d3..6282d1dc60 100644 --- a/AsyncDisplayKit/Details/ASEnvironment.h +++ b/AsyncDisplayKit/Details/ASEnvironment.h @@ -137,6 +137,8 @@ ASDISPLAYNODE_EXTERN_C_END /// convenience method. Users should access the trait collections through the NSObject based asyncTraitCollection API - (ASEnvironmentTraitCollection)environmentTraitCollection; +/// sets a trait collection on this environment state. +- (void)setEnvironmentTraitCollection:(ASEnvironmentTraitCollection)environmentTraitCollection; @end // ASCollection/TableNodes don't actually have ASCellNodes as subnodes. Because of this we can't rely on display trait @@ -154,13 +156,15 @@ ASDISPLAYNODE_EXTERN_C_END [super setEnvironmentState:environmentState];\ ASEnvironmentTraitCollection currentTraits = environmentState.traitCollection;\ if (ASEnvironmentTraitCollectionIsEqualToASEnvironmentTraitCollection(currentTraits, oldTraits) == NO) {\ - NSArray *> *completedNodes = [self.view.dataController completedNodes];\ - for (NSArray *sectionArray in completedNodes) {\ - for (ASCellNode *cellNode in sectionArray) {\ - ASEnvironmentStatePropagateDown(cellNode, currentTraits);\ - [cellNode setNeedsLayout];\ + dispatch_async(dispatch_get_main_queue(), ^{\ + NSArray *> *completedNodes = [self.view.dataController completedNodes];\ + for (NSArray *sectionArray in completedNodes) {\ + for (ASCellNode *cellNode in sectionArray) {\ + ASEnvironmentStatePropagateDown(cellNode, currentTraits);\ + [cellNode setNeedsLayout];\ + }\ }\ - }\ + });\ }\ }\ diff --git a/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.h b/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.h index 9f04490cc3..b1d8bed120 100644 --- a/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.h @@ -24,6 +24,9 @@ NS_ASSUME_NONNULL_BEGIN @param background A layoutable object that is laid out behind the child. If this is nil, the background is omitted. */ + (instancetype)backgroundLayoutSpecWithChild:(id)child background:(nullable id)background; ++ (instancetype)backgroundLayoutSpecWithChild:(id)child background:(nullable id)background traitCollect:(nullable ASTraitCollection *)traitCollection; + +- (void)setBackground:(id)background traitCollection:(nullable ASTraitCollection *)traitCollection; @end diff --git a/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.mm b/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.mm index bbeac0b882..2044a7a1e4 100644 --- a/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.mm @@ -13,6 +13,7 @@ #import "ASAssert.h" #import "ASBaseDefines.h" #import "ASLayout.h" +#import "ASTraitCollection.h" static NSString * const kBackgroundChildKey = @"kBackgroundChildKey"; @@ -21,21 +22,27 @@ static NSString * const kBackgroundChildKey = @"kBackgroundChildKey"; @implementation ASBackgroundLayoutSpec -- (instancetype)initWithChild:(id)child background:(id)background +- (instancetype)initWithChild:(id)child background:(id)background traitCollection:(ASTraitCollection *)traitCollection { if (!(self = [super init])) { return nil; } ASDisplayNodeAssertNotNil(child, @"Child cannot be nil"); - [self setChild:child]; - self.background = background; + self.environmentTraitCollection = [traitCollection environmentTraitCollection]; + [self setChild:child withTraitCollection:traitCollection]; + [self setBackground:background traitCollection:traitCollection]; return self; } + (instancetype)backgroundLayoutSpecWithChild:(id)child background:(id)background; { - return [[self alloc] initWithChild:child background:background]; + return [self backgroundLayoutSpecWithChild:child background:background traitCollect:nil]; +} + ++ (instancetype)backgroundLayoutSpecWithChild:(id)child background:(nullable id)background traitCollect:(nullable ASTraitCollection *)traitCollection +{ + return [[self alloc] initWithChild:child background:background traitCollection:traitCollection]; } /** @@ -60,7 +67,12 @@ static NSString * const kBackgroundChildKey = @"kBackgroundChildKey"; - (void)setBackground:(id)background { - [super setChild:background forIdentifier:kBackgroundChildKey]; + [self setBackground:background traitCollection:nil]; +} + +- (void)setBackground:(id)background traitCollection:(ASTraitCollection *)traitCollection +{ + [super setChild:background forIdentifier:kBackgroundChildKey withTraitCollection:traitCollection]; } - (id)background @@ -73,10 +85,4 @@ static NSString * const kBackgroundChildKey = @"kBackgroundChildKey"; ASDisplayNodeAssert(NO, @"not supported by this layout spec"); } -- (NSArray *)children -{ - ASDisplayNodeAssert(NO, @"not supported by this layout spec"); - return nil; -} - @end diff --git a/AsyncDisplayKit/Layout/ASCenterLayoutSpec.h b/AsyncDisplayKit/Layout/ASCenterLayoutSpec.h index 75a48443b7..bee64bf21d 100644 --- a/AsyncDisplayKit/Layout/ASCenterLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASCenterLayoutSpec.h @@ -58,6 +58,11 @@ NS_ASSUME_NONNULL_BEGIN sizingOptions:(ASCenterLayoutSpecSizingOptions)sizingOptions child:(id)child; ++ (instancetype)centerLayoutSpecWithCenteringOptions:(ASCenterLayoutSpecCenteringOptions)centeringOptions + sizingOptions:(ASCenterLayoutSpecSizingOptions)sizingOptions + child:(id)child + traitCollection:(nullable ASTraitCollection *)traitCollection; + @end NS_ASSUME_NONNULL_END diff --git a/AsyncDisplayKit/Layout/ASCenterLayoutSpec.mm b/AsyncDisplayKit/Layout/ASCenterLayoutSpec.mm index 147142db1c..7803faba36 100644 --- a/AsyncDisplayKit/Layout/ASCenterLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASCenterLayoutSpec.mm @@ -21,12 +21,13 @@ - (instancetype)initWithCenteringOptions:(ASCenterLayoutSpecCenteringOptions)centeringOptions sizingOptions:(ASCenterLayoutSpecSizingOptions)sizingOptions - child:(id)child; + child:(id)child + traitCollection:(ASTraitCollection *)traitCollection { ASRelativeLayoutSpecPosition verticalPosition = [self verticalPositionFromCenteringOptions:centeringOptions]; ASRelativeLayoutSpecPosition horizontalPosition = [self horizontalPositionFromCenteringOptions:centeringOptions]; - if (!(self = [super initWithHorizontalPosition:horizontalPosition verticalPosition:verticalPosition sizingOption:sizingOptions child:child])) { + if (!(self = [super initWithHorizontalPosition:horizontalPosition verticalPosition:verticalPosition sizingOption:sizingOptions child:child traitCollection:traitCollection])) { return nil; } _centeringOptions = centeringOptions; @@ -38,7 +39,15 @@ sizingOptions:(ASCenterLayoutSpecSizingOptions)sizingOptions child:(id)child { - return [[self alloc] initWithCenteringOptions:centeringOptions sizingOptions:sizingOptions child:child]; + return [self centerLayoutSpecWithCenteringOptions:centeringOptions sizingOptions:sizingOptions child:child traitCollection:nil]; +} + ++ (instancetype)centerLayoutSpecWithCenteringOptions:(ASCenterLayoutSpecCenteringOptions)centeringOptions + sizingOptions:(ASCenterLayoutSpecSizingOptions)sizingOptions + child:(id)child + traitCollection:(nullable ASTraitCollection *)traitCollection +{ + return [[self alloc] initWithCenteringOptions:centeringOptions sizingOptions:sizingOptions child:child traitCollection:traitCollection]; } - (void)setCenteringOptions:(ASCenterLayoutSpecCenteringOptions)centeringOptions diff --git a/AsyncDisplayKit/Layout/ASInsetLayoutSpec.h b/AsyncDisplayKit/Layout/ASInsetLayoutSpec.h index aa320e947d..d00d7d0aa4 100644 --- a/AsyncDisplayKit/Layout/ASInsetLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASInsetLayoutSpec.h @@ -38,6 +38,7 @@ NS_ASSUME_NONNULL_BEGIN @param child The wrapped child to inset. */ + (instancetype)insetLayoutSpecWithInsets:(UIEdgeInsets)insets child:(id)child; ++ (instancetype)insetLayoutSpecWithInsets:(UIEdgeInsets)insets child:(id)child traitCollection:(nullable ASTraitCollection *)traitCollection; @end diff --git a/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm b/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm index ce7e6b4ea9..46efd6ce59 100644 --- a/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm @@ -12,9 +12,9 @@ #import "ASAssert.h" #import "ASBaseDefines.h" - #import "ASInternalHelpers.h" #import "ASLayout.h" +#import "ASTraitCollection.h" @interface ASInsetLayoutSpec () { @@ -42,20 +42,26 @@ static CGFloat centerInset(CGFloat outer, CGFloat inner) @implementation ASInsetLayoutSpec -- (instancetype)initWithInsets:(UIEdgeInsets)insets child:(id)child; +- (instancetype)initWithInsets:(UIEdgeInsets)insets child:(id)child traitCollection:(nullable ASTraitCollection *)traitCollection { if (!(self = [super init])) { return nil; } ASDisplayNodeAssertNotNil(child, @"Child cannot be nil"); _insets = insets; - [self setChild:child]; + self.environmentTraitCollection = [traitCollection environmentTraitCollection]; + [self setChild:child withTraitCollection:traitCollection]; return self; } + (instancetype)insetLayoutSpecWithInsets:(UIEdgeInsets)insets child:(id)child { - return [[self alloc] initWithInsets:insets child:child]; + return [self insetLayoutSpecWithInsets:insets child:child traitCollection:nil]; +} + ++ (instancetype)insetLayoutSpecWithInsets:(UIEdgeInsets)insets child:(id)child traitCollection:(nullable ASTraitCollection *)traitCollection +{ + return [[self alloc] initWithInsets:insets child:child traitCollection:traitCollection]; } - (void)setInsets:(UIEdgeInsets)insets diff --git a/AsyncDisplayKit/Layout/ASLayoutSpec.h b/AsyncDisplayKit/Layout/ASLayoutSpec.h index 02a6d4f035..f18cbccf02 100644 --- a/AsyncDisplayKit/Layout/ASLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASLayoutSpec.h @@ -46,6 +46,7 @@ NS_ASSUME_NONNULL_BEGIN * property that behind the scenes is calling setChild:forIdentifier:. */ - (void)setChild:(id)child; +- (void)setChild:(id)child withTraitCollection:(ASTraitCollection *)traitCollection; /** * Adds a child with the given identifier to this layout spec. @@ -65,6 +66,7 @@ NS_ASSUME_NONNULL_BEGIN * property that behind the scenes is calling setChild:forIdentifier:. */ - (void)setChild:(id)child forIdentifier:(NSString *)identifier; +- (void)setChild:(id)child forIdentifier:(NSString *)identifier withTraitCollection:(ASTraitCollection *)traitCollection; /** * Adds childen to this layout spec. @@ -78,6 +80,7 @@ NS_ASSUME_NONNULL_BEGIN * setChild: and setChild:forIdentifier: methods to do something appropriate or to assert. */ - (void)setChildren:(NSArray> *)children; +- (void)setChildren:(NSArray> *)children withTraitCollection:(ASTraitCollection *)traitCollection; /** * Get child methods diff --git a/AsyncDisplayKit/Layout/ASLayoutSpec.mm b/AsyncDisplayKit/Layout/ASLayoutSpec.mm index 8932e27555..26be166697 100644 --- a/AsyncDisplayKit/Layout/ASLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASLayoutSpec.mm @@ -113,7 +113,13 @@ } } -- (void)setChild:(id)child; +- (void)setChild:(id)child +{ + id parent = [child parent]; + [self setChild:child withTraitCollection:[parent asyncTraitCollection]]; +} + +- (void)setChild:(id)child withTraitCollection:(ASTraitCollection *)traitCollection { ASDisplayNodeAssert(self.isMutable, @"Cannot set properties when layout spec is not mutable"); @@ -123,6 +129,12 @@ } - (void)setChild:(id)child forIdentifier:(NSString *)identifier +{ + id parent = [child parent]; + [self setChild:child forIdentifier:identifier withTraitCollection:[parent asyncTraitCollection]]; +} + +- (void)setChild:(id)child forIdentifier:(NSString *)identifier withTraitCollection:(ASTraitCollection *)traitCollection { ASDisplayNodeAssert(self.isMutable, @"Cannot set properties when layout spec is not mutable"); @@ -135,6 +147,13 @@ } - (void)setChildren:(NSArray *)children +{ + id child = [children firstObject]; + id parent = [child parent]; + [self setChildren:children withTraitCollection:[parent asyncTraitCollection]]; +} + +- (void)setChildren:(NSArray> *)children withTraitCollection:(ASTraitCollection *)traitCollection { ASDisplayNodeAssert(self.isMutable, @"Cannot set properties when layout spec is not mutable"); @@ -204,6 +223,11 @@ return _environmentState.traitCollection; } +- (void)setEnvironmentTraitCollection:(ASEnvironmentTraitCollection)traitCollection +{ + _environmentState.traitCollection = traitCollection; +} + ASEnvironmentLayoutOptionsForwarding ASEnvironmentLayoutExtensibilityForwarding diff --git a/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.h b/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.h index 6e1c321bc7..f1268e8e60 100644 --- a/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.h @@ -20,6 +20,9 @@ NS_ASSUME_NONNULL_BEGIN @property (nullable, nonatomic, strong) id overlay; + (instancetype)overlayLayoutSpecWithChild:(id)child overlay:(nullable id)overlay; ++ (instancetype)overlayLayoutSpecWithChild:(id)child overlay:(nullable id)overlay traitCollection:(nullable ASTraitCollection *)traitCollection; + +- (void)setOverlay:(id _Nullable)overlay traitCollection:(nullable ASTraitCollection *)traitCollection; @end diff --git a/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.mm b/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.mm index ba580d08b1..aa9b1726ac 100644 --- a/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.mm @@ -13,30 +13,42 @@ #import "ASAssert.h" #import "ASBaseDefines.h" #import "ASLayout.h" +#import "ASTraitCollection.h" static NSString * const kOverlayChildKey = @"kOverlayChildKey"; @implementation ASOverlayLayoutSpec -- (instancetype)initWithChild:(id)child overlay:(id)overlay +- (instancetype)initWithChild:(id)child overlay:(id)overlay traitCollection:(nullable ASTraitCollection *)traitCollection { if (!(self = [super init])) { return nil; } ASDisplayNodeAssertNotNil(child, @"Child that will be overlayed on shouldn't be nil"); - self.overlay = overlay; - [self setChild:child]; + self.environmentTraitCollection = [traitCollection environmentTraitCollection]; + [self setOverlay:overlay traitCollection:traitCollection]; + [self setChild:child withTraitCollection:traitCollection]; return self; } + (instancetype)overlayLayoutSpecWithChild:(id)child overlay:(id)overlay { - return [[self alloc] initWithChild:child overlay:overlay]; + return [self overlayLayoutSpecWithChild:child overlay:overlay traitCollection:nil]; +} + ++ (instancetype)overlayLayoutSpecWithChild:(id)child overlay:(nullable id)overlay traitCollection:(nullable ASTraitCollection *)traitCollection +{ + return [[self alloc] initWithChild:child overlay:overlay traitCollection:traitCollection]; } - (void)setOverlay:(id)overlay { - [super setChild:overlay forIdentifier:kOverlayChildKey]; + [self setOverlay:overlay traitCollection:nil]; +} + +- (void)setOverlay:(id _Nullable)overlay traitCollection:(nullable ASTraitCollection *)traitCollection +{ + return [super setChild:overlay forIdentifier:kOverlayChildKey withTraitCollection:traitCollection]; } - (id)overlay @@ -66,12 +78,6 @@ static NSString * const kOverlayChildKey = @"kOverlayChildKey"; ASDisplayNodeAssert(NO, @"not supported by this layout spec"); } -- (NSArray *)children -{ - ASDisplayNodeAssert(NO, @"not supported by this layout spec"); - return nil; -} - @end @implementation ASOverlayLayoutSpec (Debugging) diff --git a/AsyncDisplayKit/Layout/ASRatioLayoutSpec.h b/AsyncDisplayKit/Layout/ASRatioLayoutSpec.h index f910982985..d602541b4a 100644 --- a/AsyncDisplayKit/Layout/ASRatioLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASRatioLayoutSpec.h @@ -36,6 +36,7 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, assign) CGFloat ratio; + (instancetype)ratioLayoutSpecWithRatio:(CGFloat)ratio child:(id)child; ++ (instancetype)ratioLayoutSpecWithRatio:(CGFloat)ratio child:(id)child traitCollection:(nullable ASTraitCollection *)traitCollection; @end diff --git a/AsyncDisplayKit/Layout/ASRatioLayoutSpec.mm b/AsyncDisplayKit/Layout/ASRatioLayoutSpec.mm index 4e04d4ca05..38876348c3 100644 --- a/AsyncDisplayKit/Layout/ASRatioLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASRatioLayoutSpec.mm @@ -15,9 +15,9 @@ #import "ASAssert.h" #import "ASBaseDefines.h" - #import "ASInternalHelpers.h" #import "ASLayout.h" +#import "ASTraitCollection.h" @implementation ASRatioLayoutSpec { @@ -26,10 +26,15 @@ + (instancetype)ratioLayoutSpecWithRatio:(CGFloat)ratio child:(id)child { - return [[self alloc] initWithRatio:ratio child:child]; + return [self ratioLayoutSpecWithRatio:ratio child:child traitCollection:nil]; } -- (instancetype)initWithRatio:(CGFloat)ratio child:(id)child; ++ (instancetype)ratioLayoutSpecWithRatio:(CGFloat)ratio child:(id)child traitCollection:(ASTraitCollection *)traitCollection +{ + return [[self alloc] initWithRatio:ratio child:child traitCollection:traitCollection]; +} + +- (instancetype)initWithRatio:(CGFloat)ratio child:(id)child traitCollection:(ASTraitCollection *)traitCollection { if (!(self = [super init])) { return nil; @@ -37,7 +42,8 @@ ASDisplayNodeAssertNotNil(child, @"Child cannot be nil"); ASDisplayNodeAssert(ratio > 0, @"Ratio should be strictly positive, but received %f", ratio); _ratio = ratio; - [self setChild:child]; + self.environmentTraitCollection = [traitCollection environmentTraitCollection]; + [self setChild:child withTraitCollection:traitCollection]; return self; } @@ -80,12 +86,6 @@ ASDisplayNodeAssert(NO, @"not supported by this layout spec"); } -- (NSArray *)children -{ - ASDisplayNodeAssert(NO, @"not supported by this layout spec"); - return nil; -} - @end @implementation ASRatioLayoutSpec (Debugging) diff --git a/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.h b/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.h index ddc88c0664..1baafd105a 100644 --- a/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.h @@ -54,6 +54,12 @@ NS_ASSUME_NONNULL_BEGIN sizingOption:(ASRelativeLayoutSpecSizingOption)sizingOption child:(id)child; ++ (instancetype)relativePositionLayoutSpecWithHorizontalPosition:(ASRelativeLayoutSpecPosition)horizontalPosition + verticalPosition:(ASRelativeLayoutSpecPosition)verticalPosition + sizingOption:(ASRelativeLayoutSpecSizingOption)sizingOption + child:(id)child + traitCollection:(nullable ASTraitCollection *)traitCollection; + /*! * @discussion convenience initializer for a ASRelativeLayoutSpec * @param horizontalPosition how to position the item on the horizontal (x) axis @@ -65,7 +71,8 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithHorizontalPosition:(ASRelativeLayoutSpecPosition)horizontalPosition verticalPosition:(ASRelativeLayoutSpecPosition)verticalPosition sizingOption:(ASRelativeLayoutSpecSizingOption)sizingOption - child:(id)child; + child:(id)child + traitCollection:(nullable ASTraitCollection *)traitCollection; @end diff --git a/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.mm b/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.mm index 7a1a0ea5e0..516d36ec3d 100644 --- a/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.mm @@ -9,10 +9,15 @@ #import "ASInternalHelpers.h" #import "ASLayout.h" +#import "ASTraitCollection.h" @implementation ASRelativeLayoutSpec -- (instancetype)initWithHorizontalPosition:(ASRelativeLayoutSpecPosition)horizontalPosition verticalPosition:(ASRelativeLayoutSpecPosition)verticalPosition sizingOption:(ASRelativeLayoutSpecSizingOption)sizingOption child:(id)child +- (instancetype)initWithHorizontalPosition:(ASRelativeLayoutSpecPosition)horizontalPosition + verticalPosition:(ASRelativeLayoutSpecPosition)verticalPosition + sizingOption:(ASRelativeLayoutSpecSizingOption)sizingOption + child:(id)child + traitCollection:(ASTraitCollection *)traitCollection { if (!(self = [super init])) { return nil; @@ -21,13 +26,23 @@ _horizontalPosition = horizontalPosition; _verticalPosition = verticalPosition; _sizingOption = sizingOption; - [self setChild:child]; + self.environmentTraitCollection = [traitCollection environmentTraitCollection]; + [self setChild:child withTraitCollection:traitCollection]; return self; } + (instancetype)relativePositionLayoutSpecWithHorizontalPosition:(ASRelativeLayoutSpecPosition)horizontalPosition verticalPosition:(ASRelativeLayoutSpecPosition)verticalPosition sizingOption:(ASRelativeLayoutSpecSizingOption)sizingOption child:(id)child { - return [[self alloc] initWithHorizontalPosition:horizontalPosition verticalPosition:verticalPosition sizingOption:sizingOption child:child]; + return [self relativePositionLayoutSpecWithHorizontalPosition:horizontalPosition verticalPosition:verticalPosition sizingOption:sizingOption child:child traitCollection:nil]; +} + ++ (instancetype)relativePositionLayoutSpecWithHorizontalPosition:(ASRelativeLayoutSpecPosition)horizontalPosition + verticalPosition:(ASRelativeLayoutSpecPosition)verticalPosition + sizingOption:(ASRelativeLayoutSpecSizingOption)sizingOption + child:(id)child + traitCollection:(ASTraitCollection *)traitCollection +{ + return [[self alloc] initWithHorizontalPosition:horizontalPosition verticalPosition:verticalPosition sizingOption:sizingOption child:child traitCollection:traitCollection]; } - (void)setHorizontalPosition:(ASRelativeLayoutSpecPosition)horizontalPosition @@ -97,12 +112,6 @@ ASDisplayNodeAssert(NO, @"not supported by this layout spec"); } -- (NSArray *)children -{ - ASDisplayNodeAssert(NO, @"not supported by this layout spec"); - return nil; -} - - (CGFloat)proportionOfAxisForAxisPosition:(ASRelativeLayoutSpecPosition)position { if ((position & ASRelativeLayoutSpecPositionCenter) != 0) { diff --git a/AsyncDisplayKit/Layout/ASStackLayoutSpec.h b/AsyncDisplayKit/Layout/ASStackLayoutSpec.h index 2488160048..68444a00fc 100644 --- a/AsyncDisplayKit/Layout/ASStackLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASStackLayoutSpec.h @@ -71,7 +71,18 @@ NS_ASSUME_NONNULL_BEGIN @param alignItems Orientation of the children along the cross axis @param children ASLayoutable children to be positioned. */ -+ (instancetype)stackLayoutSpecWithDirection:(ASStackLayoutDirection)direction spacing:(CGFloat)spacing justifyContent:(ASStackLayoutJustifyContent)justifyContent alignItems:(ASStackLayoutAlignItems)alignItems children:(NSArray> *)children; ++ (instancetype)stackLayoutSpecWithDirection:(ASStackLayoutDirection)direction + spacing:(CGFloat)spacing + justifyContent:(ASStackLayoutJustifyContent)justifyContent + alignItems:(ASStackLayoutAlignItems)alignItems + children:(NSArray> *)children; + ++ (instancetype)stackLayoutSpecWithDirection:(ASStackLayoutDirection)direction + spacing:(CGFloat)spacing + justifyContent:(ASStackLayoutJustifyContent)justifyContent + alignItems:(ASStackLayoutAlignItems)alignItems + children:(NSArray> *)children + traitCollection:(nullable ASTraitCollection *)traitCollection; /** * @return A stack layout spec with direction of ASStackLayoutDirectionVertical diff --git a/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm b/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm index 26b6d449c7..f19f9f7555 100644 --- a/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm @@ -19,6 +19,7 @@ #import "ASStackLayoutSpecUtilities.h" #import "ASStackUnpositionedLayout.h" #import "ASThread.h" +#import "ASTraitCollection.h" @implementation ASStackLayoutSpec { @@ -27,12 +28,26 @@ - (instancetype)init { - return [self initWithDirection:ASStackLayoutDirectionHorizontal spacing:0.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsStart children:nil]; + return [self initWithDirection:ASStackLayoutDirectionHorizontal spacing:0.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsStart children:nil traitCollection:nil]; } -+ (instancetype)stackLayoutSpecWithDirection:(ASStackLayoutDirection)direction spacing:(CGFloat)spacing justifyContent:(ASStackLayoutJustifyContent)justifyContent alignItems:(ASStackLayoutAlignItems)alignItems children:(NSArray *)children ++ (instancetype)stackLayoutSpecWithDirection:(ASStackLayoutDirection)direction + spacing:(CGFloat)spacing + justifyContent:(ASStackLayoutJustifyContent)justifyContent + alignItems:(ASStackLayoutAlignItems)alignItems + children:(NSArray *)children { - return [[self alloc] initWithDirection:direction spacing:spacing justifyContent:justifyContent alignItems:alignItems children:children]; + return [self stackLayoutSpecWithDirection:direction spacing:spacing justifyContent:justifyContent alignItems:alignItems children:children traitCollection:nil]; +} + ++ (instancetype)stackLayoutSpecWithDirection:(ASStackLayoutDirection)direction + spacing:(CGFloat)spacing + justifyContent:(ASStackLayoutJustifyContent)justifyContent + alignItems:(ASStackLayoutAlignItems)alignItems + children:(NSArray> *)children + traitCollection:(ASTraitCollection *)traitCollection +{ + return [[self alloc] initWithDirection:direction spacing:spacing justifyContent:justifyContent alignItems:alignItems children:children traitCollection:traitCollection]; } + (instancetype)verticalStackLayoutSpec @@ -49,7 +64,12 @@ return stackLayoutSpec; } -- (instancetype)initWithDirection:(ASStackLayoutDirection)direction spacing:(CGFloat)spacing justifyContent:(ASStackLayoutJustifyContent)justifyContent alignItems:(ASStackLayoutAlignItems)alignItems children:(NSArray *)children +- (instancetype)initWithDirection:(ASStackLayoutDirection)direction + spacing:(CGFloat)spacing + justifyContent:(ASStackLayoutJustifyContent)justifyContent + alignItems:(ASStackLayoutAlignItems)alignItems + children:(NSArray *)children + traitCollection:(ASTraitCollection *)traitCollection { if (!(self = [super init])) { return nil; @@ -61,7 +81,8 @@ _alignItems = alignItems; _justifyContent = justifyContent; - [self setChildren:children]; + self.environmentTraitCollection = [traitCollection environmentTraitCollection]; + [self setChildren:children withTraitCollection:traitCollection]; return self; } diff --git a/AsyncDisplayKit/Layout/ASStaticLayoutSpec.h b/AsyncDisplayKit/Layout/ASStaticLayoutSpec.h index 44da4adf3d..cc6d8ec9c6 100644 --- a/AsyncDisplayKit/Layout/ASStaticLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASStaticLayoutSpec.h @@ -24,6 +24,7 @@ NS_ASSUME_NONNULL_BEGIN @param children Children to be positioned at fixed positions, each conforms to ASStaticLayoutable */ + (instancetype)staticLayoutSpecWithChildren:(NSArray> *)children; ++ (instancetype)staticLayoutSpecWithChildren:(NSArray> *)children traitCollection:(nullable ASTraitCollection *)traitCollection; @end diff --git a/AsyncDisplayKit/Layout/ASStaticLayoutSpec.mm b/AsyncDisplayKit/Layout/ASStaticLayoutSpec.mm index a727376a57..6538716353 100644 --- a/AsyncDisplayKit/Layout/ASStaticLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASStaticLayoutSpec.mm @@ -13,25 +13,32 @@ #import "ASLayoutSpecUtilities.h" #import "ASInternalHelpers.h" #import "ASLayout.h" +#import "ASTraitCollection.h" @implementation ASStaticLayoutSpec + (instancetype)staticLayoutSpecWithChildren:(NSArray *)children { - return [[self alloc] initWithChildren:children]; + return [self staticLayoutSpecWithChildren:children traitCollection:nil]; +} + ++ (instancetype)staticLayoutSpecWithChildren:(NSArray> *)children traitCollection:(ASTraitCollection *)traitCollection +{ + return [[self alloc] initWithChildren:children traitCollection:traitCollection]; } - (instancetype)init { - return [self initWithChildren:@[]]; + return [self initWithChildren:@[] traitCollection:nil]; } -- (instancetype)initWithChildren:(NSArray *)children +- (instancetype)initWithChildren:(NSArray *)children traitCollection:(ASTraitCollection *)traitCollection { if (!(self = [super init])) { return nil; } - self.children = children; + self.environmentTraitCollection = [traitCollection environmentTraitCollection]; + [self setChildren:children withTraitCollection:traitCollection]; return self; } diff --git a/AsyncDisplayKit/Private/ASEnvironmentInternal.h b/AsyncDisplayKit/Private/ASEnvironmentInternal.h index 30d62670e7..7a7b363e67 100644 --- a/AsyncDisplayKit/Private/ASEnvironmentInternal.h +++ b/AsyncDisplayKit/Private/ASEnvironmentInternal.h @@ -58,14 +58,14 @@ ASEnvironmentState ASEnvironmentMergeObjectAndState(ASEnvironmentState environme template void ASEnvironmentStatePropagateDown(id object, ASEnvironmentStateType state) { ASEnvironmentPerformBlockOnObjectAndChildren(object, ^(id node) { - object.environmentState = ASEnvironmentMergeObjectAndState(object.environmentState, state, ASEnvironmentStatePropagation::DOWN); + node.environmentState = ASEnvironmentMergeObjectAndState(node.environmentState, state, ASEnvironmentStatePropagation::DOWN); }); } template void ASEnvironmentStatePropagateUp(id object, ASEnvironmentStateType state) { ASEnvironmentPerformBlockOnObjectAndParents(object, ^(id node) { - object.environmentState = ASEnvironmentMergeObjectAndState(object.environmentState, state, ASEnvironmentStatePropagation::UP); + node.environmentState = ASEnvironmentMergeObjectAndState(node.environmentState, state, ASEnvironmentStatePropagation::UP); }); } diff --git a/examples/ASTraitCollection/Podfile b/examples/ASTraitCollection/Podfile new file mode 100644 index 0000000000..919de4b311 --- /dev/null +++ b/examples/ASTraitCollection/Podfile @@ -0,0 +1,5 @@ +source 'https://github.com/CocoaPods/Specs.git' +platform :ios, '7.0' +target 'Sample' do + pod 'AsyncDisplayKit', :path => '../..' +end diff --git a/examples/ASTraitCollection/Sample.xcodeproj/project.pbxproj b/examples/ASTraitCollection/Sample.xcodeproj/project.pbxproj new file mode 100644 index 0000000000..f9e679bb36 --- /dev/null +++ b/examples/ASTraitCollection/Sample.xcodeproj/project.pbxproj @@ -0,0 +1,385 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 05E2128719D4DB510098F589 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 05E2128619D4DB510098F589 /* main.m */; }; + 05E2128A19D4DB510098F589 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 05E2128919D4DB510098F589 /* AppDelegate.m */; }; + 05E2128D19D4DB510098F589 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 05E2128C19D4DB510098F589 /* ViewController.m */; }; + 1BEECAB53F4B61DCB949ED44 /* libPods-Sample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEDFC574739077BA65E0CF5 /* libPods-Sample.a */; }; + 9C37D01E1CC94BC9004C8BC1 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9C37D01D1CC94BC9004C8BC1 /* Launch Screen.storyboard */; }; + 9CACC7811CCEAF9E009A1613 /* TableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CACC7801CCEAF9E009A1613 /* TableViewController.m */; }; + 9CACC7841CCEAFAE009A1613 /* CollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CACC7831CCEAFAE009A1613 /* CollectionViewController.m */; }; + 9CACC7871CCEBD3B009A1613 /* KittenNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CACC7861CCEBD3B009A1613 /* KittenNode.m */; }; + 9CACC78A1CCEC82C009A1613 /* OverrideViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CACC7891CCEC82C009A1613 /* OverrideViewController.m */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 056298286C03B7760575CC56 /* Pods-Sample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Sample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Sample/Pods-Sample.debug.xcconfig"; sourceTree = ""; }; + 05E2128119D4DB510098F589 /* Sample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Sample.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 05E2128519D4DB510098F589 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 05E2128619D4DB510098F589 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 05E2128819D4DB510098F589 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; + 05E2128919D4DB510098F589 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + 05E2128B19D4DB510098F589 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; + 05E2128C19D4DB510098F589 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; + 088AA6578212BE9BFBB07B70 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; + 1EEDFC574739077BA65E0CF5 /* libPods-Sample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Sample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 3D24B17D1E4A4E7A9566C5E9 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; + 9C37D01D1CC94BC9004C8BC1 /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; + 9CACC77F1CCEAF9E009A1613 /* TableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TableViewController.h; sourceTree = ""; }; + 9CACC7801CCEAF9E009A1613 /* TableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TableViewController.m; sourceTree = ""; }; + 9CACC7821CCEAFAE009A1613 /* CollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CollectionViewController.h; sourceTree = ""; }; + 9CACC7831CCEAFAE009A1613 /* CollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CollectionViewController.m; sourceTree = ""; }; + 9CACC7851CCEBD3B009A1613 /* KittenNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KittenNode.h; sourceTree = ""; }; + 9CACC7861CCEBD3B009A1613 /* KittenNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KittenNode.m; sourceTree = ""; }; + 9CACC7881CCEC82C009A1613 /* OverrideViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OverrideViewController.h; sourceTree = ""; }; + 9CACC7891CCEC82C009A1613 /* OverrideViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OverrideViewController.m; sourceTree = ""; }; + A7F0013FBBCBEA0C9FB68986 /* Pods-Sample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Sample.release.xcconfig"; path = "Pods/Target Support Files/Pods-Sample/Pods-Sample.release.xcconfig"; sourceTree = ""; }; + C068F1D3F0CC317E895FCDAB /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 05E2127E19D4DB510098F589 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 1BEECAB53F4B61DCB949ED44 /* libPods-Sample.a in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 05E2127819D4DB510098F589 = { + isa = PBXGroup; + children = ( + 05E2128319D4DB510098F589 /* Sample */, + 05E2128219D4DB510098F589 /* Products */, + 1A943BF0259746F18D6E423F /* Frameworks */, + 1AE410B73DA5C3BD087ACDD7 /* Pods */, + ); + indentWidth = 2; + sourceTree = ""; + tabWidth = 2; + usesTabs = 0; + }; + 05E2128219D4DB510098F589 /* Products */ = { + isa = PBXGroup; + children = ( + 05E2128119D4DB510098F589 /* Sample.app */, + ); + name = Products; + sourceTree = ""; + }; + 05E2128319D4DB510098F589 /* Sample */ = { + isa = PBXGroup; + children = ( + 05E2128819D4DB510098F589 /* AppDelegate.h */, + 05E2128919D4DB510098F589 /* AppDelegate.m */, + 05E2128B19D4DB510098F589 /* ViewController.h */, + 05E2128C19D4DB510098F589 /* ViewController.m */, + 05E2128419D4DB510098F589 /* Supporting Files */, + 9CACC77F1CCEAF9E009A1613 /* TableViewController.h */, + 9CACC7801CCEAF9E009A1613 /* TableViewController.m */, + 9CACC7821CCEAFAE009A1613 /* CollectionViewController.h */, + 9CACC7831CCEAFAE009A1613 /* CollectionViewController.m */, + 9CACC7851CCEBD3B009A1613 /* KittenNode.h */, + 9CACC7861CCEBD3B009A1613 /* KittenNode.m */, + 9CACC7881CCEC82C009A1613 /* OverrideViewController.h */, + 9CACC7891CCEC82C009A1613 /* OverrideViewController.m */, + ); + path = Sample; + sourceTree = ""; + }; + 05E2128419D4DB510098F589 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 05E2128519D4DB510098F589 /* Info.plist */, + 05E2128619D4DB510098F589 /* main.m */, + 9C37D01D1CC94BC9004C8BC1 /* Launch Screen.storyboard */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 1A943BF0259746F18D6E423F /* Frameworks */ = { + isa = PBXGroup; + children = ( + 3D24B17D1E4A4E7A9566C5E9 /* libPods.a */, + 1EEDFC574739077BA65E0CF5 /* libPods-Sample.a */, + ); + name = Frameworks; + sourceTree = ""; + }; + 1AE410B73DA5C3BD087ACDD7 /* Pods */ = { + isa = PBXGroup; + children = ( + C068F1D3F0CC317E895FCDAB /* Pods.debug.xcconfig */, + 088AA6578212BE9BFBB07B70 /* Pods.release.xcconfig */, + 056298286C03B7760575CC56 /* Pods-Sample.debug.xcconfig */, + A7F0013FBBCBEA0C9FB68986 /* Pods-Sample.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 05E2128019D4DB510098F589 /* Sample */ = { + isa = PBXNativeTarget; + buildConfigurationList = 05E212A419D4DB510098F589 /* Build configuration list for PBXNativeTarget "Sample" */; + buildPhases = ( + E080B80F89C34A25B3488E26 /* 📦 Check Pods Manifest.lock */, + 05E2127D19D4DB510098F589 /* Sources */, + 05E2127E19D4DB510098F589 /* Frameworks */, + 05E2127F19D4DB510098F589 /* Resources */, + F012A6F39E0149F18F564F50 /* 📦 Copy Pods Resources */, + FFF65E837E66ADA71296F0FF /* 📦 Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Sample; + productName = Sample; + productReference = 05E2128119D4DB510098F589 /* Sample.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 05E2127919D4DB510098F589 /* Project object */ = { + isa = PBXProject; + attributes = { + LastUpgradeCheck = 0600; + ORGANIZATIONNAME = Facebook; + TargetAttributes = { + 05E2128019D4DB510098F589 = { + CreatedOnToolsVersion = 6.0.1; + }; + }; + }; + buildConfigurationList = 05E2127C19D4DB510098F589 /* Build configuration list for PBXProject "Sample" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 05E2127819D4DB510098F589; + productRefGroup = 05E2128219D4DB510098F589 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 05E2128019D4DB510098F589 /* Sample */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 05E2127F19D4DB510098F589 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 9C37D01E1CC94BC9004C8BC1 /* Launch Screen.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + E080B80F89C34A25B3488E26 /* 📦 Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Check Pods Manifest.lock"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; + showEnvVarsInLog = 0; + }; + F012A6F39E0149F18F564F50 /* 📦 Copy Pods Resources */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Copy Pods Resources"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Sample/Pods-Sample-resources.sh\"\n"; + showEnvVarsInLog = 0; + }; + FFF65E837E66ADA71296F0FF /* 📦 Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "📦 Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Sample/Pods-Sample-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 05E2127D19D4DB510098F589 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 05E2128D19D4DB510098F589 /* ViewController.m in Sources */, + 9CACC78A1CCEC82C009A1613 /* OverrideViewController.m in Sources */, + 05E2128A19D4DB510098F589 /* AppDelegate.m in Sources */, + 05E2128719D4DB510098F589 /* main.m in Sources */, + 9CACC7841CCEAFAE009A1613 /* CollectionViewController.m in Sources */, + 9CACC7871CCEBD3B009A1613 /* KittenNode.m in Sources */, + 9CACC7811CCEAF9E009A1613 /* TableViewController.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 05E212A219D4DB510098F589 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + }; + name = Debug; + }; + 05E212A319D4DB510098F589 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 05E212A519D4DB510098F589 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 056298286C03B7760575CC56 /* Pods-Sample.debug.xcconfig */; + buildSettings = { + INFOPLIST_FILE = Sample/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 05E212A619D4DB510098F589 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = A7F0013FBBCBEA0C9FB68986 /* Pods-Sample.release.xcconfig */; + buildSettings = { + INFOPLIST_FILE = Sample/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 05E2127C19D4DB510098F589 /* Build configuration list for PBXProject "Sample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 05E212A219D4DB510098F589 /* Debug */, + 05E212A319D4DB510098F589 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 05E212A419D4DB510098F589 /* Build configuration list for PBXNativeTarget "Sample" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 05E212A519D4DB510098F589 /* Debug */, + 05E212A619D4DB510098F589 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 05E2127919D4DB510098F589 /* Project object */; +} diff --git a/examples/ASTraitCollection/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/ASTraitCollection/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..a80c038249 --- /dev/null +++ b/examples/ASTraitCollection/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/examples/ASTraitCollection/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme b/examples/ASTraitCollection/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme new file mode 100644 index 0000000000..1e14aa0329 --- /dev/null +++ b/examples/ASTraitCollection/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/ASTraitCollection/Sample.xcworkspace/contents.xcworkspacedata b/examples/ASTraitCollection/Sample.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..7b5a2f3050 --- /dev/null +++ b/examples/ASTraitCollection/Sample.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/examples/ASTraitCollection/Sample/AppDelegate.h b/examples/ASTraitCollection/Sample/AppDelegate.h new file mode 100644 index 0000000000..85855277e9 --- /dev/null +++ b/examples/ASTraitCollection/Sample/AppDelegate.h @@ -0,0 +1,20 @@ +/* This file provided by Facebook is for non-commercial testing and evaluation + * purposes only. Facebook reserves all rights not expressly granted. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#import + +#define UseAutomaticLayout 1 + +@interface AppDelegate : UIResponder + +@property (strong, nonatomic) UIWindow *window; + +@end diff --git a/examples/ASTraitCollection/Sample/AppDelegate.m b/examples/ASTraitCollection/Sample/AppDelegate.m new file mode 100644 index 0000000000..63928f1c38 --- /dev/null +++ b/examples/ASTraitCollection/Sample/AppDelegate.m @@ -0,0 +1,31 @@ +/* This file provided by Facebook is for non-commercial testing and evaluation + * purposes only. Facebook reserves all rights not expressly granted. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#import "AppDelegate.h" + +#import "ViewController.h" +#import "TableViewController.h" +#import "CollectionViewController.h" + +@implementation AppDelegate + +- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions +{ + self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; + self.window.backgroundColor = [UIColor whiteColor]; + UITabBarController *tabController = [[UITabBarController alloc] init]; + [tabController setViewControllers:@[[[ViewController alloc] init], [[TableViewController alloc] init], [[CollectionViewController alloc] init]]]; + self.window.rootViewController = tabController; + [self.window makeKeyAndVisible]; + return YES; +} + +@end diff --git a/examples/ASTraitCollection/Sample/CollectionViewController.h b/examples/ASTraitCollection/Sample/CollectionViewController.h new file mode 100644 index 0000000000..613cf835e4 --- /dev/null +++ b/examples/ASTraitCollection/Sample/CollectionViewController.h @@ -0,0 +1,15 @@ +/* This file provided by Facebook is for non-commercial testing and evaluation + * purposes only. Facebook reserves all rights not expressly granted. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#import + +@interface CollectionViewController : ASViewController +@end diff --git a/examples/ASTraitCollection/Sample/CollectionViewController.m b/examples/ASTraitCollection/Sample/CollectionViewController.m new file mode 100644 index 0000000000..532b43e051 --- /dev/null +++ b/examples/ASTraitCollection/Sample/CollectionViewController.m @@ -0,0 +1,73 @@ +/* This file provided by Facebook is for non-commercial testing and evaluation + * purposes only. Facebook reserves all rights not expressly granted. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#import "CollectionViewController.h" +#import "KittenNode.h" +#import + +@interface CollectionViewController () +@property (nonatomic, strong) ASCollectionNode *collectionNode; +@end + +@implementation CollectionViewController + +- (instancetype)init +{ + UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; + layout.minimumLineSpacing = 10; + layout.minimumInteritemSpacing = 10; + + ASCollectionNode *collectionNode = [[ASCollectionNode alloc] initWithCollectionViewLayout:layout]; + + if (!(self = [super initWithNode:collectionNode])) + return nil; + + self.title = @"Collection Node"; + _collectionNode = collectionNode; + collectionNode.dataSource = self; + collectionNode.delegate = self; + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + self.collectionNode.view.contentInset = UIEdgeInsetsMake(20, 10, CGRectGetHeight(self.tabBarController.tabBar.frame), 10); +} + +#pragma mark - ASCollectionDataSource + +- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section +{ + return 50; +} + +- (ASCellNode *)collectionView:(ASCollectionView *)collectionView nodeForItemAtIndexPath:(NSIndexPath *)indexPath +{ + KittenNode *cell = [[KittenNode alloc] init]; + cell.textNode.maximumNumberOfLines = 3; + cell.imageTappedBlock = ^{ + [KittenNode defaultImageTappedAction:self]; + }; + return cell; +} + +- (ASSizeRange)collectionView:(ASCollectionView *)collectionView constrainedSizeForNodeAtIndexPath:(NSIndexPath *)indexPath +{ + ASTraitCollection *traitCollection = [self.collectionNode asyncTraitCollection]; + + if (traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) { + return ASSizeRangeMake(CGSizeMake(200, 120), CGSizeMake(200, 120)); + } + return ASSizeRangeMake(CGSizeMake(132, 180), CGSizeMake(132, 180)); +} + +@end diff --git a/examples/ASTraitCollection/Sample/Info.plist b/examples/ASTraitCollection/Sample/Info.plist new file mode 100644 index 0000000000..acc713cc71 --- /dev/null +++ b/examples/ASTraitCollection/Sample/Info.plist @@ -0,0 +1,39 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.facebook.AsyncDisplayKit.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + Launch Screen + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortraitUpsideDown + + + diff --git a/examples/ASTraitCollection/Sample/KittenNode.h b/examples/ASTraitCollection/Sample/KittenNode.h new file mode 100644 index 0000000000..ae73a8900b --- /dev/null +++ b/examples/ASTraitCollection/Sample/KittenNode.h @@ -0,0 +1,23 @@ +/* This file provided by Facebook is for non-commercial testing and evaluation + * purposes only. Facebook reserves all rights not expressly granted. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#import + +@interface KittenNode : ASCellNode +@property (nonatomic, strong, readonly) ASNetworkImageNode *imageNode; +@property (nonatomic, strong, readonly) ASTextNode *textNode; + +@property (nonatomic, copy) dispatch_block_t imageTappedBlock; + +// The default action when an image node is tapped. This action will create an +// OverrideVC and override its display traits to always be compact. ++ (void)defaultImageTappedAction:(ASViewController *)sourceViewController; +@end diff --git a/examples/ASTraitCollection/Sample/KittenNode.m b/examples/ASTraitCollection/Sample/KittenNode.m new file mode 100644 index 0000000000..ef572e2265 --- /dev/null +++ b/examples/ASTraitCollection/Sample/KittenNode.m @@ -0,0 +1,170 @@ +/* This file provided by Facebook is for non-commercial testing and evaluation + * purposes only. Facebook reserves all rights not expressly granted. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#import "KittenNode.h" +#import "OverrideViewController.h" + +#import + +static const CGFloat kOuterPadding = 16.0f; +static const CGFloat kInnerPadding = 10.0f; + +@interface KittenNode () +{ + CGSize _kittenSize; +} + +@end + + +@implementation KittenNode + +// lorem ipsum text courtesy https://kittyipsum.com/ <3 ++ (NSArray *)placeholders +{ + static NSArray *placeholders = nil; + + static dispatch_once_t once; + dispatch_once(&once, ^{ + placeholders = @[ + @"Kitty ipsum dolor sit amet, purr sleep on your face lay down in your way biting, sniff tincidunt a etiam fluffy fur judging you stuck in a tree kittens.", + @"Lick tincidunt a biting eat the grass, egestas enim ut lick leap puking climb the curtains lick.", + @"Lick quis nunc toss the mousie vel, tortor pellentesque sunbathe orci turpis non tail flick suscipit sleep in the sink.", + @"Orci turpis litter box et stuck in a tree, egestas ac tempus et aliquam elit.", + @"Hairball iaculis dolor dolor neque, nibh adipiscing vehicula egestas dolor aliquam.", + @"Sunbathe fluffy fur tortor faucibus pharetra jump, enim jump on the table I don't like that food catnip toss the mousie scratched.", + @"Quis nunc nam sleep in the sink quis nunc purr faucibus, chase the red dot consectetur bat sagittis.", + @"Lick tail flick jump on the table stretching purr amet, rhoncus scratched jump on the table run.", + @"Suspendisse aliquam vulputate feed me sleep on your keyboard, rip the couch faucibus sleep on your keyboard tristique give me fish dolor.", + @"Rip the couch hiss attack your ankles biting pellentesque puking, enim suspendisse enim mauris a.", + @"Sollicitudin iaculis vestibulum toss the mousie biting attack your ankles, puking nunc jump adipiscing in viverra.", + @"Nam zzz amet neque, bat tincidunt a iaculis sniff hiss bibendum leap nibh.", + @"Chase the red dot enim puking chuf, tristique et egestas sniff sollicitudin pharetra enim ut mauris a.", + @"Sagittis scratched et lick, hairball leap attack adipiscing catnip tail flick iaculis lick.", + @"Neque neque sleep in the sink neque sleep on your face, climb the curtains chuf tail flick sniff tortor non.", + @"Ac etiam kittens claw toss the mousie jump, pellentesque rhoncus litter box give me fish adipiscing mauris a.", + @"Pharetra egestas sunbathe faucibus ac fluffy fur, hiss feed me give me fish accumsan.", + @"Tortor leap tristique accumsan rutrum sleep in the sink, amet sollicitudin adipiscing dolor chase the red dot.", + @"Knock over the lamp pharetra vehicula sleep on your face rhoncus, jump elit cras nec quis quis nunc nam.", + @"Sollicitudin feed me et ac in viverra catnip, nunc eat I don't like that food iaculis give me fish.", + ]; + }); + + return placeholders; +} + +- (instancetype)init +{ + if (!(self = [super init])) + return nil; + + _kittenSize = CGSizeMake(100,100); + + // kitten image, with a solid background colour serving as placeholder + _imageNode = [[ASNetworkImageNode alloc] init]; + _imageNode.backgroundColor = ASDisplayNodeDefaultPlaceholderColor(); + _imageNode.preferredFrameSize = _kittenSize; + [_imageNode addTarget:self action:@selector(imageTapped:) forControlEvents:ASControlNodeEventTouchUpInside]; + + CGFloat scale = [UIScreen mainScreen].scale; + _imageNode.URL = [NSURL URLWithString:[NSString stringWithFormat:@"https://placekitten.com/%zd/%zd?image=%zd", + (NSInteger)roundl(_kittenSize.width * scale), + (NSInteger)roundl(_kittenSize.height * scale), + (NSInteger)arc4random_uniform(20)]]; + [self addSubnode:_imageNode]; + + // lorem ipsum text, plus some nice styling + _textNode = [[ASTextNode alloc] init]; + _textNode.attributedString = [[NSAttributedString alloc] initWithString:[self kittyIpsum] + attributes:[self textStyle]]; + _textNode.flexShrink = YES; + _textNode.flexGrow = YES; + [self addSubnode:_textNode]; + + return self; +} + +- (void)imageTapped:(id)sender +{ + if (self.imageTappedBlock) { + self.imageTappedBlock(); + } +} + +- (NSString *)kittyIpsum +{ + NSArray *placeholders = [KittenNode placeholders]; + u_int32_t ipsumCount = (u_int32_t)[placeholders count]; + u_int32_t location = arc4random_uniform(ipsumCount); + u_int32_t length = arc4random_uniform(ipsumCount - location); + + NSMutableString *string = [placeholders[location] mutableCopy]; + for (u_int32_t i = location + 1; i < location + length; i++) { + [string appendString:(i % 2 == 0) ? @"\n" : @" "]; + [string appendString:placeholders[i]]; + } + + return string; +} + +- (NSDictionary *)textStyle +{ + UIFont *font = [UIFont fontWithName:@"HelveticaNeue" size:12.0f]; + + NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; + style.paragraphSpacing = 0.5 * font.lineHeight; + style.hyphenationFactor = 1.0; + + return @{ NSFontAttributeName: font, + NSParagraphStyleAttributeName: style, + ASTextNodeWordKerningAttributeName : @.5}; +} + +- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize +{ + ASTraitCollection *traitCollection = [self asyncTraitCollection]; + + ASStackLayoutSpec *stackSpec = [[ASStackLayoutSpec alloc] init]; + stackSpec.spacing = kInnerPadding; + [stackSpec setChildren:@[_imageNode, _textNode] withTraitCollection:traitCollection]; + + if (traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) { + _imageNode.alignSelf = ASStackLayoutAlignSelfStart; + stackSpec.direction = ASStackLayoutDirectionHorizontal; + } else { + _imageNode.alignSelf = ASStackLayoutAlignSelfCenter; + stackSpec.direction = ASStackLayoutDirectionVertical; + } + + return [ASInsetLayoutSpec insetLayoutSpecWithInsets:UIEdgeInsetsMake(kOuterPadding, kOuterPadding, kOuterPadding, kOuterPadding) child:stackSpec traitCollection:traitCollection]; +} + ++ (void)defaultImageTappedAction:(ASViewController *)sourceViewController +{ + OverrideViewController *overrideVC = [[OverrideViewController alloc] init]; + + overrideVC.overrideDisplayTraitsWithTraitCollection = ^(UITraitCollection *traitCollection) { + ASTraitCollection *asyncTraitCollection = [ASTraitCollection traitCollectionWithDisplayScale:traitCollection.displayScale + userInterfaceIdiom:traitCollection.userInterfaceIdiom + horizontalSizeClass:UIUserInterfaceSizeClassCompact + verticalSizeClass:UIUserInterfaceSizeClassCompact + forceTouchCapability:traitCollection.forceTouchCapability + traitCollectionContext:nil]; + return asyncTraitCollection; + }; + + [sourceViewController presentViewController:overrideVC animated:YES completion:nil]; + overrideVC.closeBlock = ^{ + [sourceViewController dismissViewControllerAnimated:YES completion:nil]; + }; +} + +@end diff --git a/examples/ASTraitCollection/Sample/Launch Screen.storyboard b/examples/ASTraitCollection/Sample/Launch Screen.storyboard new file mode 100644 index 0000000000..95c8ef474d --- /dev/null +++ b/examples/ASTraitCollection/Sample/Launch Screen.storyboard @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/ASTraitCollection/Sample/OverrideViewController.h b/examples/ASTraitCollection/Sample/OverrideViewController.h new file mode 100644 index 0000000000..9d9e69d839 --- /dev/null +++ b/examples/ASTraitCollection/Sample/OverrideViewController.h @@ -0,0 +1,29 @@ +/* This file provided by Facebook is for non-commercial testing and evaluation + * purposes only. Facebook reserves all rights not expressly granted. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#import + +/* + * A simple node that displays the attribution for the kitties in the app. Note that + * for a regular horizontal size class it does something stupid and sets the font size to 100. + * It's VC, OverrideViewController, will have its display traits overridden such that + * it will always have a compact horizontal size class. + */ +@interface OverrideNode : ASDisplayNode +@end + +/* + * This is a fairly stupid VC that's main purpose is to show how to override ASDisplayTraits. + * Take a look at `defaultImageTappedAction` in KittenNode to see how this is accomplished. + */ +@interface OverrideViewController : ASViewController +@property (nonatomic, copy) dispatch_block_t closeBlock; +@end diff --git a/examples/ASTraitCollection/Sample/OverrideViewController.m b/examples/ASTraitCollection/Sample/OverrideViewController.m new file mode 100644 index 0000000000..84acf5ef24 --- /dev/null +++ b/examples/ASTraitCollection/Sample/OverrideViewController.m @@ -0,0 +1,97 @@ +/* This file provided by Facebook is for non-commercial testing and evaluation + * purposes only. Facebook reserves all rights not expressly granted. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#import "OverrideViewController.h" +#import + +static NSString *kLinkAttributeName = @"PlaceKittenNodeLinkAttributeName"; + +@interface OverrideNode() +@property (nonatomic, strong) ASTextNode *textNode; +@property (nonatomic, strong) ASButtonNode *buttonNode; +@end + +@implementation OverrideNode + +- (instancetype)init +{ + if (!(self = [super init])) + return nil; + + _textNode = [[ASTextNode alloc] init]; + _textNode.flexGrow = YES; + _textNode.flexShrink = YES; + _textNode.maximumNumberOfLines = 3; + [self addSubnode:_textNode]; + + _buttonNode = [[ASButtonNode alloc] init]; + [_buttonNode setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Close"] forState:ASControlStateNormal]; + [self addSubnode:_buttonNode]; + + self.backgroundColor = [UIColor lightGrayColor]; + + return self; +} + +- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize +{ + CGFloat pointSize = 16.f; + ASTraitCollection *traitCollection = [self asyncTraitCollection]; + if (traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) { + // This should never happen because we override the VC's display traits to always be compact. + pointSize = 100; + } + + NSString *blurb = @"kittens courtesy placekitten.com"; + NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:blurb]; + [string addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"HelveticaNeue" size:pointSize] range:NSMakeRange(0, blurb.length)]; + [string addAttributes:@{ + kLinkAttributeName: [NSURL URLWithString:@"http://placekitten.com/"], + NSForegroundColorAttributeName: [UIColor grayColor], + NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle | NSUnderlinePatternDot), + } + range:[blurb rangeOfString:@"placekitten.com"]]; + + _textNode.attributedString = string; + + ASStackLayoutSpec *stackSpec = [ASStackLayoutSpec verticalStackLayoutSpec]; + [stackSpec setChildren:@[_textNode, _buttonNode] withTraitCollection:traitCollection]; + stackSpec.spacing = 10; + return [ASInsetLayoutSpec insetLayoutSpecWithInsets:UIEdgeInsetsMake(40, 20, 20, 20) child:stackSpec traitCollection:traitCollection]; +} + +@end + +@interface OverrideViewController () + +@end + +@implementation OverrideViewController + +- (instancetype)init +{ + OverrideNode *overrideNode = [[OverrideNode alloc] init]; + + if (!(self = [super initWithNode:overrideNode])) + return nil; + + [overrideNode.buttonNode addTarget:self action:@selector(closeTapped:) forControlEvents:ASControlNodeEventTouchUpInside]; + return self; +} + +- (void)closeTapped:(id)sender +{ + if (self.closeBlock) { + self.closeBlock(); + } +} + +@end diff --git a/examples/ASTraitCollection/Sample/TableViewController.h b/examples/ASTraitCollection/Sample/TableViewController.h new file mode 100644 index 0000000000..364dde8597 --- /dev/null +++ b/examples/ASTraitCollection/Sample/TableViewController.h @@ -0,0 +1,16 @@ +/* This file provided by Facebook is for non-commercial testing and evaluation + * purposes only. Facebook reserves all rights not expressly granted. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#import + +@interface TableViewController : ASViewController + +@end diff --git a/examples/ASTraitCollection/Sample/TableViewController.m b/examples/ASTraitCollection/Sample/TableViewController.m new file mode 100644 index 0000000000..bd897a7c75 --- /dev/null +++ b/examples/ASTraitCollection/Sample/TableViewController.m @@ -0,0 +1,62 @@ +/* This file provided by Facebook is for non-commercial testing and evaluation + * purposes only. Facebook reserves all rights not expressly granted. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#import "TableViewController.h" +#import "KittenNode.h" + +@interface TableViewController () +@property (nonatomic, strong) ASTableNode *tableNode; +@end + +@implementation TableViewController + +- (instancetype)init +{ + ASTableNode *tableNode = [[ASTableNode alloc] init]; + if (!(self = [super initWithNode:tableNode])) + return nil; + + _tableNode = tableNode; + tableNode.delegate = self; + tableNode.dataSource = self; + self.title = @"Table Node"; + return self; +} + +- (void)viewDidLoad +{ + [super viewDidLoad]; + self.tableNode.view.contentInset = UIEdgeInsetsMake(CGRectGetHeight([[UIApplication sharedApplication] statusBarFrame]), 0, CGRectGetHeight(self.tabBarController.tabBar.frame), 0); +} + +#pragma mark - +#pragma mark ASTableView. + +- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath +{ + [tableView deselectRowAtIndexPath:indexPath animated:YES]; +} + +- (ASCellNode *)tableView:(ASTableView *)tableView nodeForRowAtIndexPath:(NSIndexPath *)indexPath +{ + KittenNode *cell = [[KittenNode alloc] init]; + cell.imageTappedBlock = ^{ + [KittenNode defaultImageTappedAction:self]; + }; + return cell; +} + +- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section +{ + return 15; +} + +@end diff --git a/examples/ASTraitCollection/Sample/ViewController.h b/examples/ASTraitCollection/Sample/ViewController.h new file mode 100644 index 0000000000..aa1d583729 --- /dev/null +++ b/examples/ASTraitCollection/Sample/ViewController.h @@ -0,0 +1,16 @@ +/* This file provided by Facebook is for non-commercial testing and evaluation + * purposes only. Facebook reserves all rights not expressly granted. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#import + +@interface ViewController : ASViewController + +@end diff --git a/examples/ASTraitCollection/Sample/ViewController.m b/examples/ASTraitCollection/Sample/ViewController.m new file mode 100644 index 0000000000..42e9cb9a4a --- /dev/null +++ b/examples/ASTraitCollection/Sample/ViewController.m @@ -0,0 +1,45 @@ +/* This file provided by Facebook is for non-commercial testing and evaluation + * purposes only. Facebook reserves all rights not expressly granted. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#import "ViewController.h" +#import "KittenNode.h" +#import "OverrideViewController.h" + +#import +#import + +@interface ViewController () +@end + +@implementation ViewController + +#pragma mark - +#pragma mark UIViewController. + +- (instancetype)init +{ + KittenNode *displayNode = [[KittenNode alloc] init]; + if (!(self = [super initWithNode:displayNode])) + return nil; + + self.title = @"Display Node"; + displayNode.imageTappedBlock = ^{ + [KittenNode defaultImageTappedAction:self]; + }; + return self; +} + +- (void)viewWillLayoutSubviews +{ + [super viewWillLayoutSubviews]; +} + +@end diff --git a/examples/ASTraitCollection/Sample/main.m b/examples/ASTraitCollection/Sample/main.m new file mode 100644 index 0000000000..ae9488711c --- /dev/null +++ b/examples/ASTraitCollection/Sample/main.m @@ -0,0 +1,20 @@ +/* This file provided by Facebook is for non-commercial testing and evaluation + * purposes only. Facebook reserves all rights not expressly granted. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN + * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#import + +#import "AppDelegate.h" + +int main(int argc, char * argv[]) { + @autoreleasepool { + return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); + } +} From a33966d4ae3be6e0360db652a5c169b208c5fa6b Mon Sep 17 00:00:00 2001 From: ricky Date: Tue, 24 May 2016 11:15:41 -0700 Subject: [PATCH 02/10] Actually propagate the traits down on layout spec --- AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm | 6 ------ AsyncDisplayKit/Layout/ASLayoutSpec.mm | 3 +++ 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm b/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm index 46efd6ce59..757e95d90e 100644 --- a/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm @@ -126,10 +126,4 @@ static CGFloat centerInset(CGFloat outer, CGFloat inner) ASDisplayNodeAssert(NO, @"not supported by this layout spec"); } -- (NSArray *)children -{ - ASDisplayNodeAssert(NO, @"not supported by this layout spec"); - return nil; -} - @end diff --git a/AsyncDisplayKit/Layout/ASLayoutSpec.mm b/AsyncDisplayKit/Layout/ASLayoutSpec.mm index 26be166697..396d70efc0 100644 --- a/AsyncDisplayKit/Layout/ASLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASLayoutSpec.mm @@ -126,6 +126,7 @@ id finalLayoutable = [self layoutableToAddFromLayoutable:child]; _child = finalLayoutable; [self propagateUpLayoutable:finalLayoutable]; + ASEnvironmentStatePropagateDown(self, [traitCollection environmentTraitCollection]); } - (void)setChild:(id)child forIdentifier:(NSString *)identifier @@ -140,6 +141,7 @@ id finalLayoutable = [self layoutableToAddFromLayoutable:child]; self.childrenWithIdentifier[identifier] = finalLayoutable; + ASEnvironmentStatePropagateDown(self, [traitCollection environmentTraitCollection]); // TODO: Should we propagate up the layoutable at it could happen that multiple children will propagated up their // layout options and one child will overwrite values from another child @@ -166,6 +168,7 @@ if (finalChildren.size() > 0) { _children = [NSArray arrayWithObjects:&finalChildren[0] count:finalChildren.size()]; } + ASEnvironmentStatePropagateDown(self, [traitCollection environmentTraitCollection]); } - (id)childForIdentifier:(NSString *)identifier From c42b0dd33a6c80d942a2bc9ee9739d1d1d503bf1 Mon Sep 17 00:00:00 2001 From: ricky Date: Wed, 25 May 2016 10:49:42 -0700 Subject: [PATCH 03/10] Remove explicit passing of trait collection to setChild/Children --- AsyncDisplayKit/ASDisplayNode.mm | 1 + AsyncDisplayKit/Details/ASTraitCollection.h | 1 + AsyncDisplayKit/Details/ASTraitCollection.m | 10 ++++++ .../Layout/ASBackgroundLayoutSpec.h | 3 -- .../Layout/ASBackgroundLayoutSpec.mm | 22 +++---------- AsyncDisplayKit/Layout/ASCenterLayoutSpec.h | 5 --- AsyncDisplayKit/Layout/ASCenterLayoutSpec.mm | 15 ++------- AsyncDisplayKit/Layout/ASInsetLayoutSpec.h | 1 - AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm | 14 +++------ AsyncDisplayKit/Layout/ASLayoutSpec.h | 7 +++-- AsyncDisplayKit/Layout/ASLayoutSpec.mm | 31 +++++-------------- AsyncDisplayKit/Layout/ASOverlayLayoutSpec.h | 3 -- AsyncDisplayKit/Layout/ASOverlayLayoutSpec.mm | 22 +++---------- AsyncDisplayKit/Layout/ASRatioLayoutSpec.h | 1 - AsyncDisplayKit/Layout/ASRatioLayoutSpec.mm | 14 +++------ AsyncDisplayKit/Layout/ASRelativeLayoutSpec.h | 9 +----- .../Layout/ASRelativeLayoutSpec.mm | 21 ++----------- AsyncDisplayKit/Layout/ASStackLayoutSpec.h | 13 +------- AsyncDisplayKit/Layout/ASStackLayoutSpec.mm | 31 +++---------------- AsyncDisplayKit/Layout/ASStaticLayoutSpec.h | 1 - AsyncDisplayKit/Layout/ASStaticLayoutSpec.mm | 15 +++------ 21 files changed, 59 insertions(+), 181 deletions(-) diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 0232c141f9..2a1c59067b 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -1904,6 +1904,7 @@ void recursivelyTriggerDisplayForLayer(CALayer *layer, BOOL shouldBlock) if ((_methodOverrides & ASDisplayNodeMethodOverrideLayoutSpecThatFits) || _layoutSpecBlock != NULL) { ASLayoutSpec *layoutSpec = [self layoutSpecThatFits:constrainedSize]; layoutSpec.parent = self; // This causes upward propogation of any non-default layoutable values. + layoutSpec.traitCollection = self.asyncTraitCollection; layoutSpec.isMutable = NO; ASLayout *layout = [layoutSpec measureWithSizeRange:constrainedSize]; // Make sure layoutableObject of the root layout is `self`, so that the flattened layout will be structurally correct. diff --git a/AsyncDisplayKit/Details/ASTraitCollection.h b/AsyncDisplayKit/Details/ASTraitCollection.h index 2168a40302..5d6118cab4 100644 --- a/AsyncDisplayKit/Details/ASTraitCollection.h +++ b/AsyncDisplayKit/Details/ASTraitCollection.h @@ -50,5 +50,6 @@ - (ASEnvironmentTraitCollection)environmentTraitCollection; +- (BOOL)isEqualToTraitCollection:(ASTraitCollection *)traitCollection; @end diff --git a/AsyncDisplayKit/Details/ASTraitCollection.m b/AsyncDisplayKit/Details/ASTraitCollection.m index af492c759f..d424c2effa 100644 --- a/AsyncDisplayKit/Details/ASTraitCollection.m +++ b/AsyncDisplayKit/Details/ASTraitCollection.m @@ -95,4 +95,14 @@ }; } +- (BOOL)isEqualToTraitCollection:(ASTraitCollection *)traitCollection +{ + return self.displayScale == traitCollection.displayScale && + self.horizontalSizeClass == traitCollection.horizontalSizeClass && + self.verticalSizeClass == traitCollection.verticalSizeClass && + self.userInterfaceIdiom == traitCollection.userInterfaceIdiom && + self.traitCollectionContext == traitCollection.traitCollectionContext && + self.forceTouchCapability == traitCollection.forceTouchCapability; +} + @end diff --git a/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.h b/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.h index b1d8bed120..9f04490cc3 100644 --- a/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.h @@ -24,9 +24,6 @@ NS_ASSUME_NONNULL_BEGIN @param background A layoutable object that is laid out behind the child. If this is nil, the background is omitted. */ + (instancetype)backgroundLayoutSpecWithChild:(id)child background:(nullable id)background; -+ (instancetype)backgroundLayoutSpecWithChild:(id)child background:(nullable id)background traitCollect:(nullable ASTraitCollection *)traitCollection; - -- (void)setBackground:(id)background traitCollection:(nullable ASTraitCollection *)traitCollection; @end diff --git a/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.mm b/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.mm index 2044a7a1e4..77f41112f2 100644 --- a/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.mm @@ -13,7 +13,6 @@ #import "ASAssert.h" #import "ASBaseDefines.h" #import "ASLayout.h" -#import "ASTraitCollection.h" static NSString * const kBackgroundChildKey = @"kBackgroundChildKey"; @@ -22,27 +21,21 @@ static NSString * const kBackgroundChildKey = @"kBackgroundChildKey"; @implementation ASBackgroundLayoutSpec -- (instancetype)initWithChild:(id)child background:(id)background traitCollection:(ASTraitCollection *)traitCollection +- (instancetype)initWithChild:(id)child background:(id)background { if (!(self = [super init])) { return nil; } ASDisplayNodeAssertNotNil(child, @"Child cannot be nil"); - self.environmentTraitCollection = [traitCollection environmentTraitCollection]; - [self setChild:child withTraitCollection:traitCollection]; - [self setBackground:background traitCollection:traitCollection]; + [self setChild:child]; + self.background = background; return self; } + (instancetype)backgroundLayoutSpecWithChild:(id)child background:(id)background; { - return [self backgroundLayoutSpecWithChild:child background:background traitCollect:nil]; -} - -+ (instancetype)backgroundLayoutSpecWithChild:(id)child background:(nullable id)background traitCollect:(nullable ASTraitCollection *)traitCollection -{ - return [[self alloc] initWithChild:child background:background traitCollection:traitCollection]; + return [[self alloc] initWithChild:child background:background]; } /** @@ -67,12 +60,7 @@ static NSString * const kBackgroundChildKey = @"kBackgroundChildKey"; - (void)setBackground:(id)background { - [self setBackground:background traitCollection:nil]; -} - -- (void)setBackground:(id)background traitCollection:(ASTraitCollection *)traitCollection -{ - [super setChild:background forIdentifier:kBackgroundChildKey withTraitCollection:traitCollection]; + [super setChild:background forIdentifier:kBackgroundChildKey]; } - (id)background diff --git a/AsyncDisplayKit/Layout/ASCenterLayoutSpec.h b/AsyncDisplayKit/Layout/ASCenterLayoutSpec.h index bee64bf21d..75a48443b7 100644 --- a/AsyncDisplayKit/Layout/ASCenterLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASCenterLayoutSpec.h @@ -58,11 +58,6 @@ NS_ASSUME_NONNULL_BEGIN sizingOptions:(ASCenterLayoutSpecSizingOptions)sizingOptions child:(id)child; -+ (instancetype)centerLayoutSpecWithCenteringOptions:(ASCenterLayoutSpecCenteringOptions)centeringOptions - sizingOptions:(ASCenterLayoutSpecSizingOptions)sizingOptions - child:(id)child - traitCollection:(nullable ASTraitCollection *)traitCollection; - @end NS_ASSUME_NONNULL_END diff --git a/AsyncDisplayKit/Layout/ASCenterLayoutSpec.mm b/AsyncDisplayKit/Layout/ASCenterLayoutSpec.mm index 7803faba36..147142db1c 100644 --- a/AsyncDisplayKit/Layout/ASCenterLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASCenterLayoutSpec.mm @@ -21,13 +21,12 @@ - (instancetype)initWithCenteringOptions:(ASCenterLayoutSpecCenteringOptions)centeringOptions sizingOptions:(ASCenterLayoutSpecSizingOptions)sizingOptions - child:(id)child - traitCollection:(ASTraitCollection *)traitCollection + child:(id)child; { ASRelativeLayoutSpecPosition verticalPosition = [self verticalPositionFromCenteringOptions:centeringOptions]; ASRelativeLayoutSpecPosition horizontalPosition = [self horizontalPositionFromCenteringOptions:centeringOptions]; - if (!(self = [super initWithHorizontalPosition:horizontalPosition verticalPosition:verticalPosition sizingOption:sizingOptions child:child traitCollection:traitCollection])) { + if (!(self = [super initWithHorizontalPosition:horizontalPosition verticalPosition:verticalPosition sizingOption:sizingOptions child:child])) { return nil; } _centeringOptions = centeringOptions; @@ -39,15 +38,7 @@ sizingOptions:(ASCenterLayoutSpecSizingOptions)sizingOptions child:(id)child { - return [self centerLayoutSpecWithCenteringOptions:centeringOptions sizingOptions:sizingOptions child:child traitCollection:nil]; -} - -+ (instancetype)centerLayoutSpecWithCenteringOptions:(ASCenterLayoutSpecCenteringOptions)centeringOptions - sizingOptions:(ASCenterLayoutSpecSizingOptions)sizingOptions - child:(id)child - traitCollection:(nullable ASTraitCollection *)traitCollection -{ - return [[self alloc] initWithCenteringOptions:centeringOptions sizingOptions:sizingOptions child:child traitCollection:traitCollection]; + return [[self alloc] initWithCenteringOptions:centeringOptions sizingOptions:sizingOptions child:child]; } - (void)setCenteringOptions:(ASCenterLayoutSpecCenteringOptions)centeringOptions diff --git a/AsyncDisplayKit/Layout/ASInsetLayoutSpec.h b/AsyncDisplayKit/Layout/ASInsetLayoutSpec.h index d00d7d0aa4..aa320e947d 100644 --- a/AsyncDisplayKit/Layout/ASInsetLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASInsetLayoutSpec.h @@ -38,7 +38,6 @@ NS_ASSUME_NONNULL_BEGIN @param child The wrapped child to inset. */ + (instancetype)insetLayoutSpecWithInsets:(UIEdgeInsets)insets child:(id)child; -+ (instancetype)insetLayoutSpecWithInsets:(UIEdgeInsets)insets child:(id)child traitCollection:(nullable ASTraitCollection *)traitCollection; @end diff --git a/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm b/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm index 757e95d90e..befb7edc3b 100644 --- a/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm @@ -12,9 +12,9 @@ #import "ASAssert.h" #import "ASBaseDefines.h" + #import "ASInternalHelpers.h" #import "ASLayout.h" -#import "ASTraitCollection.h" @interface ASInsetLayoutSpec () { @@ -42,26 +42,20 @@ static CGFloat centerInset(CGFloat outer, CGFloat inner) @implementation ASInsetLayoutSpec -- (instancetype)initWithInsets:(UIEdgeInsets)insets child:(id)child traitCollection:(nullable ASTraitCollection *)traitCollection +- (instancetype)initWithInsets:(UIEdgeInsets)insets child:(id)child; { if (!(self = [super init])) { return nil; } ASDisplayNodeAssertNotNil(child, @"Child cannot be nil"); _insets = insets; - self.environmentTraitCollection = [traitCollection environmentTraitCollection]; - [self setChild:child withTraitCollection:traitCollection]; + [self setChild:child]; return self; } + (instancetype)insetLayoutSpecWithInsets:(UIEdgeInsets)insets child:(id)child { - return [self insetLayoutSpecWithInsets:insets child:child traitCollection:nil]; -} - -+ (instancetype)insetLayoutSpecWithInsets:(UIEdgeInsets)insets child:(id)child traitCollection:(nullable ASTraitCollection *)traitCollection -{ - return [[self alloc] initWithInsets:insets child:child traitCollection:traitCollection]; + return [[self alloc] initWithInsets:insets child:child]; } - (void)setInsets:(UIEdgeInsets)insets diff --git a/AsyncDisplayKit/Layout/ASLayoutSpec.h b/AsyncDisplayKit/Layout/ASLayoutSpec.h index f18cbccf02..3f7a9586d6 100644 --- a/AsyncDisplayKit/Layout/ASLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASLayoutSpec.h @@ -11,6 +11,8 @@ #import #import +@class ASTraitCollection; + NS_ASSUME_NONNULL_BEGIN /** A layout spec is an immutable object that describes a layout, loosely inspired by React. */ @@ -23,6 +25,8 @@ NS_ASSUME_NONNULL_BEGIN */ @property (nonatomic, assign) BOOL isMutable; +@property (nonatomic, strong, nullable) ASTraitCollection *traitCollection; + - (instancetype)init; /** @@ -46,7 +50,6 @@ NS_ASSUME_NONNULL_BEGIN * property that behind the scenes is calling setChild:forIdentifier:. */ - (void)setChild:(id)child; -- (void)setChild:(id)child withTraitCollection:(ASTraitCollection *)traitCollection; /** * Adds a child with the given identifier to this layout spec. @@ -66,7 +69,6 @@ NS_ASSUME_NONNULL_BEGIN * property that behind the scenes is calling setChild:forIdentifier:. */ - (void)setChild:(id)child forIdentifier:(NSString *)identifier; -- (void)setChild:(id)child forIdentifier:(NSString *)identifier withTraitCollection:(ASTraitCollection *)traitCollection; /** * Adds childen to this layout spec. @@ -80,7 +82,6 @@ NS_ASSUME_NONNULL_BEGIN * setChild: and setChild:forIdentifier: methods to do something appropriate or to assert. */ - (void)setChildren:(NSArray> *)children; -- (void)setChildren:(NSArray> *)children withTraitCollection:(ASTraitCollection *)traitCollection; /** * Get child methods diff --git a/AsyncDisplayKit/Layout/ASLayoutSpec.mm b/AsyncDisplayKit/Layout/ASLayoutSpec.mm index 396d70efc0..2de93d49b2 100644 --- a/AsyncDisplayKit/Layout/ASLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASLayoutSpec.mm @@ -114,48 +114,27 @@ } - (void)setChild:(id)child -{ - id parent = [child parent]; - [self setChild:child withTraitCollection:[parent asyncTraitCollection]]; -} - -- (void)setChild:(id)child withTraitCollection:(ASTraitCollection *)traitCollection { ASDisplayNodeAssert(self.isMutable, @"Cannot set properties when layout spec is not mutable"); id finalLayoutable = [self layoutableToAddFromLayoutable:child]; _child = finalLayoutable; [self propagateUpLayoutable:finalLayoutable]; - ASEnvironmentStatePropagateDown(self, [traitCollection environmentTraitCollection]); } - (void)setChild:(id)child forIdentifier:(NSString *)identifier -{ - id parent = [child parent]; - [self setChild:child forIdentifier:identifier withTraitCollection:[parent asyncTraitCollection]]; -} - -- (void)setChild:(id)child forIdentifier:(NSString *)identifier withTraitCollection:(ASTraitCollection *)traitCollection { ASDisplayNodeAssert(self.isMutable, @"Cannot set properties when layout spec is not mutable"); id finalLayoutable = [self layoutableToAddFromLayoutable:child]; self.childrenWithIdentifier[identifier] = finalLayoutable; - ASEnvironmentStatePropagateDown(self, [traitCollection environmentTraitCollection]); // TODO: Should we propagate up the layoutable at it could happen that multiple children will propagated up their // layout options and one child will overwrite values from another child // [self propagateUpLayoutable:finalLayoutable]; } -- (void)setChildren:(NSArray *)children -{ - id child = [children firstObject]; - id parent = [child parent]; - [self setChildren:children withTraitCollection:[parent asyncTraitCollection]]; -} - -- (void)setChildren:(NSArray> *)children withTraitCollection:(ASTraitCollection *)traitCollection +- (void)setChildren:(NSArray> *)children { ASDisplayNodeAssert(self.isMutable, @"Cannot set properties when layout spec is not mutable"); @@ -168,7 +147,6 @@ if (finalChildren.size() > 0) { _children = [NSArray arrayWithObjects:&finalChildren[0] count:finalChildren.size()]; } - ASEnvironmentStatePropagateDown(self, [traitCollection environmentTraitCollection]); } - (id)childForIdentifier:(NSString *)identifier @@ -186,6 +164,13 @@ return [_children copy]; } +- (void)setTraitCollection:(ASTraitCollection *)traitCollection +{ + if ([traitCollection isEqualToTraitCollection:self.traitCollection] == NO) { + _traitCollection = traitCollection; + ASEnvironmentStatePropagateDown(self, [traitCollection environmentTraitCollection]); + } +} #pragma mark - ASEnvironment diff --git a/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.h b/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.h index f1268e8e60..6e1c321bc7 100644 --- a/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.h @@ -20,9 +20,6 @@ NS_ASSUME_NONNULL_BEGIN @property (nullable, nonatomic, strong) id overlay; + (instancetype)overlayLayoutSpecWithChild:(id)child overlay:(nullable id)overlay; -+ (instancetype)overlayLayoutSpecWithChild:(id)child overlay:(nullable id)overlay traitCollection:(nullable ASTraitCollection *)traitCollection; - -- (void)setOverlay:(id _Nullable)overlay traitCollection:(nullable ASTraitCollection *)traitCollection; @end diff --git a/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.mm b/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.mm index aa9b1726ac..f8cef20a18 100644 --- a/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.mm @@ -13,42 +13,30 @@ #import "ASAssert.h" #import "ASBaseDefines.h" #import "ASLayout.h" -#import "ASTraitCollection.h" static NSString * const kOverlayChildKey = @"kOverlayChildKey"; @implementation ASOverlayLayoutSpec -- (instancetype)initWithChild:(id)child overlay:(id)overlay traitCollection:(nullable ASTraitCollection *)traitCollection +- (instancetype)initWithChild:(id)child overlay:(id)overlay { if (!(self = [super init])) { return nil; } ASDisplayNodeAssertNotNil(child, @"Child that will be overlayed on shouldn't be nil"); - self.environmentTraitCollection = [traitCollection environmentTraitCollection]; - [self setOverlay:overlay traitCollection:traitCollection]; - [self setChild:child withTraitCollection:traitCollection]; + self.overlay = overlay; + [self setChild:child]; return self; } + (instancetype)overlayLayoutSpecWithChild:(id)child overlay:(id)overlay { - return [self overlayLayoutSpecWithChild:child overlay:overlay traitCollection:nil]; -} - -+ (instancetype)overlayLayoutSpecWithChild:(id)child overlay:(nullable id)overlay traitCollection:(nullable ASTraitCollection *)traitCollection -{ - return [[self alloc] initWithChild:child overlay:overlay traitCollection:traitCollection]; + return [[self alloc] initWithChild:child overlay:overlay]; } - (void)setOverlay:(id)overlay { - [self setOverlay:overlay traitCollection:nil]; -} - -- (void)setOverlay:(id _Nullable)overlay traitCollection:(nullable ASTraitCollection *)traitCollection -{ - return [super setChild:overlay forIdentifier:kOverlayChildKey withTraitCollection:traitCollection]; + [super setChild:overlay forIdentifier:kOverlayChildKey]; } - (id)overlay diff --git a/AsyncDisplayKit/Layout/ASRatioLayoutSpec.h b/AsyncDisplayKit/Layout/ASRatioLayoutSpec.h index d602541b4a..f910982985 100644 --- a/AsyncDisplayKit/Layout/ASRatioLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASRatioLayoutSpec.h @@ -36,7 +36,6 @@ NS_ASSUME_NONNULL_BEGIN @property (nonatomic, assign) CGFloat ratio; + (instancetype)ratioLayoutSpecWithRatio:(CGFloat)ratio child:(id)child; -+ (instancetype)ratioLayoutSpecWithRatio:(CGFloat)ratio child:(id)child traitCollection:(nullable ASTraitCollection *)traitCollection; @end diff --git a/AsyncDisplayKit/Layout/ASRatioLayoutSpec.mm b/AsyncDisplayKit/Layout/ASRatioLayoutSpec.mm index 38876348c3..17d18a763d 100644 --- a/AsyncDisplayKit/Layout/ASRatioLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASRatioLayoutSpec.mm @@ -15,9 +15,9 @@ #import "ASAssert.h" #import "ASBaseDefines.h" + #import "ASInternalHelpers.h" #import "ASLayout.h" -#import "ASTraitCollection.h" @implementation ASRatioLayoutSpec { @@ -26,15 +26,10 @@ + (instancetype)ratioLayoutSpecWithRatio:(CGFloat)ratio child:(id)child { - return [self ratioLayoutSpecWithRatio:ratio child:child traitCollection:nil]; + return [[self alloc] initWithRatio:ratio child:child]; } -+ (instancetype)ratioLayoutSpecWithRatio:(CGFloat)ratio child:(id)child traitCollection:(ASTraitCollection *)traitCollection -{ - return [[self alloc] initWithRatio:ratio child:child traitCollection:traitCollection]; -} - -- (instancetype)initWithRatio:(CGFloat)ratio child:(id)child traitCollection:(ASTraitCollection *)traitCollection +- (instancetype)initWithRatio:(CGFloat)ratio child:(id)child; { if (!(self = [super init])) { return nil; @@ -42,8 +37,7 @@ ASDisplayNodeAssertNotNil(child, @"Child cannot be nil"); ASDisplayNodeAssert(ratio > 0, @"Ratio should be strictly positive, but received %f", ratio); _ratio = ratio; - self.environmentTraitCollection = [traitCollection environmentTraitCollection]; - [self setChild:child withTraitCollection:traitCollection]; + [self setChild:child]; return self; } diff --git a/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.h b/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.h index 1baafd105a..ddc88c0664 100644 --- a/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.h @@ -54,12 +54,6 @@ NS_ASSUME_NONNULL_BEGIN sizingOption:(ASRelativeLayoutSpecSizingOption)sizingOption child:(id)child; -+ (instancetype)relativePositionLayoutSpecWithHorizontalPosition:(ASRelativeLayoutSpecPosition)horizontalPosition - verticalPosition:(ASRelativeLayoutSpecPosition)verticalPosition - sizingOption:(ASRelativeLayoutSpecSizingOption)sizingOption - child:(id)child - traitCollection:(nullable ASTraitCollection *)traitCollection; - /*! * @discussion convenience initializer for a ASRelativeLayoutSpec * @param horizontalPosition how to position the item on the horizontal (x) axis @@ -71,8 +65,7 @@ NS_ASSUME_NONNULL_BEGIN - (instancetype)initWithHorizontalPosition:(ASRelativeLayoutSpecPosition)horizontalPosition verticalPosition:(ASRelativeLayoutSpecPosition)verticalPosition sizingOption:(ASRelativeLayoutSpecSizingOption)sizingOption - child:(id)child - traitCollection:(nullable ASTraitCollection *)traitCollection; + child:(id)child; @end diff --git a/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.mm b/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.mm index 516d36ec3d..e1c2d6c0d3 100644 --- a/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.mm @@ -9,15 +9,10 @@ #import "ASInternalHelpers.h" #import "ASLayout.h" -#import "ASTraitCollection.h" @implementation ASRelativeLayoutSpec -- (instancetype)initWithHorizontalPosition:(ASRelativeLayoutSpecPosition)horizontalPosition - verticalPosition:(ASRelativeLayoutSpecPosition)verticalPosition - sizingOption:(ASRelativeLayoutSpecSizingOption)sizingOption - child:(id)child - traitCollection:(ASTraitCollection *)traitCollection +- (instancetype)initWithHorizontalPosition:(ASRelativeLayoutSpecPosition)horizontalPosition verticalPosition:(ASRelativeLayoutSpecPosition)verticalPosition sizingOption:(ASRelativeLayoutSpecSizingOption)sizingOption child:(id)child { if (!(self = [super init])) { return nil; @@ -26,23 +21,13 @@ _horizontalPosition = horizontalPosition; _verticalPosition = verticalPosition; _sizingOption = sizingOption; - self.environmentTraitCollection = [traitCollection environmentTraitCollection]; - [self setChild:child withTraitCollection:traitCollection]; + [self setChild:child]; return self; } + (instancetype)relativePositionLayoutSpecWithHorizontalPosition:(ASRelativeLayoutSpecPosition)horizontalPosition verticalPosition:(ASRelativeLayoutSpecPosition)verticalPosition sizingOption:(ASRelativeLayoutSpecSizingOption)sizingOption child:(id)child { - return [self relativePositionLayoutSpecWithHorizontalPosition:horizontalPosition verticalPosition:verticalPosition sizingOption:sizingOption child:child traitCollection:nil]; -} - -+ (instancetype)relativePositionLayoutSpecWithHorizontalPosition:(ASRelativeLayoutSpecPosition)horizontalPosition - verticalPosition:(ASRelativeLayoutSpecPosition)verticalPosition - sizingOption:(ASRelativeLayoutSpecSizingOption)sizingOption - child:(id)child - traitCollection:(ASTraitCollection *)traitCollection -{ - return [[self alloc] initWithHorizontalPosition:horizontalPosition verticalPosition:verticalPosition sizingOption:sizingOption child:child traitCollection:traitCollection]; + return [[self alloc] initWithHorizontalPosition:horizontalPosition verticalPosition:verticalPosition sizingOption:sizingOption child:child]; } - (void)setHorizontalPosition:(ASRelativeLayoutSpecPosition)horizontalPosition diff --git a/AsyncDisplayKit/Layout/ASStackLayoutSpec.h b/AsyncDisplayKit/Layout/ASStackLayoutSpec.h index 68444a00fc..2488160048 100644 --- a/AsyncDisplayKit/Layout/ASStackLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASStackLayoutSpec.h @@ -71,18 +71,7 @@ NS_ASSUME_NONNULL_BEGIN @param alignItems Orientation of the children along the cross axis @param children ASLayoutable children to be positioned. */ -+ (instancetype)stackLayoutSpecWithDirection:(ASStackLayoutDirection)direction - spacing:(CGFloat)spacing - justifyContent:(ASStackLayoutJustifyContent)justifyContent - alignItems:(ASStackLayoutAlignItems)alignItems - children:(NSArray> *)children; - -+ (instancetype)stackLayoutSpecWithDirection:(ASStackLayoutDirection)direction - spacing:(CGFloat)spacing - justifyContent:(ASStackLayoutJustifyContent)justifyContent - alignItems:(ASStackLayoutAlignItems)alignItems - children:(NSArray> *)children - traitCollection:(nullable ASTraitCollection *)traitCollection; ++ (instancetype)stackLayoutSpecWithDirection:(ASStackLayoutDirection)direction spacing:(CGFloat)spacing justifyContent:(ASStackLayoutJustifyContent)justifyContent alignItems:(ASStackLayoutAlignItems)alignItems children:(NSArray> *)children; /** * @return A stack layout spec with direction of ASStackLayoutDirectionVertical diff --git a/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm b/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm index f19f9f7555..26b6d449c7 100644 --- a/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm @@ -19,7 +19,6 @@ #import "ASStackLayoutSpecUtilities.h" #import "ASStackUnpositionedLayout.h" #import "ASThread.h" -#import "ASTraitCollection.h" @implementation ASStackLayoutSpec { @@ -28,26 +27,12 @@ - (instancetype)init { - return [self initWithDirection:ASStackLayoutDirectionHorizontal spacing:0.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsStart children:nil traitCollection:nil]; + return [self initWithDirection:ASStackLayoutDirectionHorizontal spacing:0.0 justifyContent:ASStackLayoutJustifyContentStart alignItems:ASStackLayoutAlignItemsStart children:nil]; } -+ (instancetype)stackLayoutSpecWithDirection:(ASStackLayoutDirection)direction - spacing:(CGFloat)spacing - justifyContent:(ASStackLayoutJustifyContent)justifyContent - alignItems:(ASStackLayoutAlignItems)alignItems - children:(NSArray *)children ++ (instancetype)stackLayoutSpecWithDirection:(ASStackLayoutDirection)direction spacing:(CGFloat)spacing justifyContent:(ASStackLayoutJustifyContent)justifyContent alignItems:(ASStackLayoutAlignItems)alignItems children:(NSArray *)children { - return [self stackLayoutSpecWithDirection:direction spacing:spacing justifyContent:justifyContent alignItems:alignItems children:children traitCollection:nil]; -} - -+ (instancetype)stackLayoutSpecWithDirection:(ASStackLayoutDirection)direction - spacing:(CGFloat)spacing - justifyContent:(ASStackLayoutJustifyContent)justifyContent - alignItems:(ASStackLayoutAlignItems)alignItems - children:(NSArray> *)children - traitCollection:(ASTraitCollection *)traitCollection -{ - return [[self alloc] initWithDirection:direction spacing:spacing justifyContent:justifyContent alignItems:alignItems children:children traitCollection:traitCollection]; + return [[self alloc] initWithDirection:direction spacing:spacing justifyContent:justifyContent alignItems:alignItems children:children]; } + (instancetype)verticalStackLayoutSpec @@ -64,12 +49,7 @@ return stackLayoutSpec; } -- (instancetype)initWithDirection:(ASStackLayoutDirection)direction - spacing:(CGFloat)spacing - justifyContent:(ASStackLayoutJustifyContent)justifyContent - alignItems:(ASStackLayoutAlignItems)alignItems - children:(NSArray *)children - traitCollection:(ASTraitCollection *)traitCollection +- (instancetype)initWithDirection:(ASStackLayoutDirection)direction spacing:(CGFloat)spacing justifyContent:(ASStackLayoutJustifyContent)justifyContent alignItems:(ASStackLayoutAlignItems)alignItems children:(NSArray *)children { if (!(self = [super init])) { return nil; @@ -81,8 +61,7 @@ _alignItems = alignItems; _justifyContent = justifyContent; - self.environmentTraitCollection = [traitCollection environmentTraitCollection]; - [self setChildren:children withTraitCollection:traitCollection]; + [self setChildren:children]; return self; } diff --git a/AsyncDisplayKit/Layout/ASStaticLayoutSpec.h b/AsyncDisplayKit/Layout/ASStaticLayoutSpec.h index cc6d8ec9c6..44da4adf3d 100644 --- a/AsyncDisplayKit/Layout/ASStaticLayoutSpec.h +++ b/AsyncDisplayKit/Layout/ASStaticLayoutSpec.h @@ -24,7 +24,6 @@ NS_ASSUME_NONNULL_BEGIN @param children Children to be positioned at fixed positions, each conforms to ASStaticLayoutable */ + (instancetype)staticLayoutSpecWithChildren:(NSArray> *)children; -+ (instancetype)staticLayoutSpecWithChildren:(NSArray> *)children traitCollection:(nullable ASTraitCollection *)traitCollection; @end diff --git a/AsyncDisplayKit/Layout/ASStaticLayoutSpec.mm b/AsyncDisplayKit/Layout/ASStaticLayoutSpec.mm index 6538716353..a727376a57 100644 --- a/AsyncDisplayKit/Layout/ASStaticLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASStaticLayoutSpec.mm @@ -13,32 +13,25 @@ #import "ASLayoutSpecUtilities.h" #import "ASInternalHelpers.h" #import "ASLayout.h" -#import "ASTraitCollection.h" @implementation ASStaticLayoutSpec + (instancetype)staticLayoutSpecWithChildren:(NSArray *)children { - return [self staticLayoutSpecWithChildren:children traitCollection:nil]; -} - -+ (instancetype)staticLayoutSpecWithChildren:(NSArray> *)children traitCollection:(ASTraitCollection *)traitCollection -{ - return [[self alloc] initWithChildren:children traitCollection:traitCollection]; + return [[self alloc] initWithChildren:children]; } - (instancetype)init { - return [self initWithChildren:@[] traitCollection:nil]; + return [self initWithChildren:@[]]; } -- (instancetype)initWithChildren:(NSArray *)children traitCollection:(ASTraitCollection *)traitCollection +- (instancetype)initWithChildren:(NSArray *)children { if (!(self = [super init])) { return nil; } - self.environmentTraitCollection = [traitCollection environmentTraitCollection]; - [self setChildren:children withTraitCollection:traitCollection]; + self.children = children; return self; } From bebc4c604c7a596673306f442f490381b9dbdfd2 Mon Sep 17 00:00:00 2001 From: ricky Date: Wed, 25 May 2016 13:30:35 -0700 Subject: [PATCH 04/10] remove _child from ASLayoutSpec.mm. Store all children in the children array. --- AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.mm | 5 ----- AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm | 5 ----- AsyncDisplayKit/Layout/ASLayoutSpec.mm | 6 +++--- AsyncDisplayKit/Layout/ASOverlayLayoutSpec.mm | 5 ----- AsyncDisplayKit/Layout/ASRatioLayoutSpec.mm | 5 ----- AsyncDisplayKit/Layout/ASRelativeLayoutSpec.mm | 5 ----- AsyncDisplayKit/Layout/ASStackLayoutSpec.mm | 11 ----------- AsyncDisplayKit/Layout/ASStaticLayoutSpec.mm | 11 ----------- 8 files changed, 3 insertions(+), 50 deletions(-) diff --git a/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.mm b/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.mm index 77f41112f2..ea18aca990 100644 --- a/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASBackgroundLayoutSpec.mm @@ -68,9 +68,4 @@ static NSString * const kBackgroundChildKey = @"kBackgroundChildKey"; return [super childForIdentifier:kBackgroundChildKey]; } -- (void)setChildren:(NSArray *)children -{ - ASDisplayNodeAssert(NO, @"not supported by this layout spec"); -} - @end diff --git a/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm b/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm index befb7edc3b..5c03393be7 100644 --- a/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASInsetLayoutSpec.mm @@ -115,9 +115,4 @@ static CGFloat centerInset(CGFloat outer, CGFloat inner) return [ASLayout layoutWithLayoutableObject:self size:computedSize sublayouts:@[sublayout]]; } -- (void)setChildren:(NSArray *)children -{ - ASDisplayNodeAssert(NO, @"not supported by this layout spec"); -} - @end diff --git a/AsyncDisplayKit/Layout/ASLayoutSpec.mm b/AsyncDisplayKit/Layout/ASLayoutSpec.mm index 2de93d49b2..b656a95782 100644 --- a/AsyncDisplayKit/Layout/ASLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASLayoutSpec.mm @@ -26,7 +26,6 @@ ASEnvironmentState _environmentState; ASDN::RecursiveMutex _propertyLock; - id _child; NSArray *_children; NSMutableDictionary *_childrenWithIdentifier; } @@ -118,7 +117,7 @@ ASDisplayNodeAssert(self.isMutable, @"Cannot set properties when layout spec is not mutable"); id finalLayoutable = [self layoutableToAddFromLayoutable:child]; - _child = finalLayoutable; + _children = @[finalLayoutable]; [self propagateUpLayoutable:finalLayoutable]; } @@ -128,6 +127,7 @@ id finalLayoutable = [self layoutableToAddFromLayoutable:child]; self.childrenWithIdentifier[identifier] = finalLayoutable; + self.children = [self.children arrayByAddingObject:finalLayoutable]; // TODO: Should we propagate up the layoutable at it could happen that multiple children will propagated up their // layout options and one child will overwrite values from another child @@ -156,7 +156,7 @@ - (id)child { - return _child; + return [_children firstObject]; } - (NSArray *)children diff --git a/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.mm b/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.mm index f8cef20a18..892872179e 100644 --- a/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASOverlayLayoutSpec.mm @@ -61,11 +61,6 @@ static NSString * const kOverlayChildKey = @"kOverlayChildKey"; return [ASLayout layoutWithLayoutableObject:self size:contentsLayout.size sublayouts:sublayouts]; } -- (void)setChildren:(NSArray *)children -{ - ASDisplayNodeAssert(NO, @"not supported by this layout spec"); -} - @end @implementation ASOverlayLayoutSpec (Debugging) diff --git a/AsyncDisplayKit/Layout/ASRatioLayoutSpec.mm b/AsyncDisplayKit/Layout/ASRatioLayoutSpec.mm index 17d18a763d..4e9c66ed98 100644 --- a/AsyncDisplayKit/Layout/ASRatioLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASRatioLayoutSpec.mm @@ -75,11 +75,6 @@ return [ASLayout layoutWithLayoutableObject:self size:sublayout.size sublayouts:@[sublayout]]; } -- (void)setChildren:(NSArray *)children -{ - ASDisplayNodeAssert(NO, @"not supported by this layout spec"); -} - @end @implementation ASRatioLayoutSpec (Debugging) diff --git a/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.mm b/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.mm index e1c2d6c0d3..4206171b5e 100644 --- a/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASRelativeLayoutSpec.mm @@ -92,11 +92,6 @@ return [ASLayout layoutWithLayoutableObject:self size:size sublayouts:@[sublayout]]; } -- (void)setChildren:(NSArray *)children -{ - ASDisplayNodeAssert(NO, @"not supported by this layout spec"); -} - - (CGFloat)proportionOfAxisForAxisPosition:(ASRelativeLayoutSpecPosition)position { if ((position & ASRelativeLayoutSpecPositionCenter) != 0) { diff --git a/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm b/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm index 26b6d449c7..cb99f38288 100644 --- a/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASStackLayoutSpec.mm @@ -121,17 +121,6 @@ _baselineRelativeArrangement = baselineRelativeArrangement; } -- (void)setChild:(id)child forIdentifier:(NSString *)identifier -{ - ASDisplayNodeAssert(NO, @"ASStackLayoutSpec only supports setChildren"); -} - -- (id)childForIdentifier:(NSString *)identifier -{ - ASDisplayNodeAssert(NO, @"ASStackLayoutSpec only supports children"); - return nil; -} - - (ASLayout *)measureWithSizeRange:(ASSizeRange)constrainedSize { if (self.children.count == 0) { diff --git a/AsyncDisplayKit/Layout/ASStaticLayoutSpec.mm b/AsyncDisplayKit/Layout/ASStaticLayoutSpec.mm index a727376a57..68db47ff14 100644 --- a/AsyncDisplayKit/Layout/ASStaticLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASStaticLayoutSpec.mm @@ -72,17 +72,6 @@ sublayouts:sublayouts]; } -- (void)setChild:(id)child forIdentifier:(NSString *)identifier -{ - ASDisplayNodeAssert(NO, @"ASStaticLayoutSpec only supports setChildren"); -} - -- (id)childForIdentifier:(NSString *)identifier -{ - ASDisplayNodeAssert(NO, @"ASStaticLayoutSpec only supports children"); - return nil; -} - @end @implementation ASStaticLayoutSpec (ASEnvironment) From 096f20c8d52469f37b9bed0509fb89d962a24729 Mon Sep 17 00:00:00 2001 From: ricky Date: Wed, 25 May 2016 13:34:43 -0700 Subject: [PATCH 05/10] update sample app --- examples/ASTraitCollection/Sample/KittenNode.m | 8 +++----- .../ASTraitCollection/Sample/OverrideViewController.m | 4 ++-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/examples/ASTraitCollection/Sample/KittenNode.m b/examples/ASTraitCollection/Sample/KittenNode.m index ef572e2265..18babcdc36 100644 --- a/examples/ASTraitCollection/Sample/KittenNode.m +++ b/examples/ASTraitCollection/Sample/KittenNode.m @@ -130,13 +130,11 @@ static const CGFloat kInnerPadding = 10.0f; - (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize { - ASTraitCollection *traitCollection = [self asyncTraitCollection]; - ASStackLayoutSpec *stackSpec = [[ASStackLayoutSpec alloc] init]; stackSpec.spacing = kInnerPadding; - [stackSpec setChildren:@[_imageNode, _textNode] withTraitCollection:traitCollection]; + [stackSpec setChildren:@[_imageNode, _textNode]]; - if (traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) { + if (self.asyncTraitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) { _imageNode.alignSelf = ASStackLayoutAlignSelfStart; stackSpec.direction = ASStackLayoutDirectionHorizontal; } else { @@ -144,7 +142,7 @@ static const CGFloat kInnerPadding = 10.0f; stackSpec.direction = ASStackLayoutDirectionVertical; } - return [ASInsetLayoutSpec insetLayoutSpecWithInsets:UIEdgeInsetsMake(kOuterPadding, kOuterPadding, kOuterPadding, kOuterPadding) child:stackSpec traitCollection:traitCollection]; + return [ASInsetLayoutSpec insetLayoutSpecWithInsets:UIEdgeInsetsMake(kOuterPadding, kOuterPadding, kOuterPadding, kOuterPadding) child:stackSpec]; } + (void)defaultImageTappedAction:(ASViewController *)sourceViewController diff --git a/examples/ASTraitCollection/Sample/OverrideViewController.m b/examples/ASTraitCollection/Sample/OverrideViewController.m index 84acf5ef24..e9f2b957f1 100644 --- a/examples/ASTraitCollection/Sample/OverrideViewController.m +++ b/examples/ASTraitCollection/Sample/OverrideViewController.m @@ -63,9 +63,9 @@ static NSString *kLinkAttributeName = @"PlaceKittenNodeLinkAttributeName"; _textNode.attributedString = string; ASStackLayoutSpec *stackSpec = [ASStackLayoutSpec verticalStackLayoutSpec]; - [stackSpec setChildren:@[_textNode, _buttonNode] withTraitCollection:traitCollection]; + [stackSpec setChildren:@[_textNode, _buttonNode]]; stackSpec.spacing = 10; - return [ASInsetLayoutSpec insetLayoutSpecWithInsets:UIEdgeInsetsMake(40, 20, 20, 20) child:stackSpec traitCollection:traitCollection]; + return [ASInsetLayoutSpec insetLayoutSpecWithInsets:UIEdgeInsetsMake(40, 20, 20, 20) child:stackSpec]; } @end From cf2d9aef5cd7b1753e80916f496613ad20f4bce4 Mon Sep 17 00:00:00 2001 From: rcancro Date: Thu, 26 May 2016 15:44:21 -0700 Subject: [PATCH 06/10] fix crash when setting layoutSpec's child to nil --- AsyncDisplayKit/Layout/ASLayoutSpec.mm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/AsyncDisplayKit/Layout/ASLayoutSpec.mm b/AsyncDisplayKit/Layout/ASLayoutSpec.mm index b656a95782..a14a4e1e32 100644 --- a/AsyncDisplayKit/Layout/ASLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASLayoutSpec.mm @@ -117,8 +117,10 @@ ASDisplayNodeAssert(self.isMutable, @"Cannot set properties when layout spec is not mutable"); id finalLayoutable = [self layoutableToAddFromLayoutable:child]; - _children = @[finalLayoutable]; - [self propagateUpLayoutable:finalLayoutable]; + if (finalLayoutable) { + _children = @[finalLayoutable]; + [self propagateUpLayoutable:finalLayoutable]; + } } - (void)setChild:(id)child forIdentifier:(NSString *)identifier @@ -127,7 +129,9 @@ id finalLayoutable = [self layoutableToAddFromLayoutable:child]; self.childrenWithIdentifier[identifier] = finalLayoutable; - self.children = [self.children arrayByAddingObject:finalLayoutable]; + if (finalLayoutable) { + self.children = [self.children arrayByAddingObject:finalLayoutable]; + } // TODO: Should we propagate up the layoutable at it could happen that multiple children will propagated up their // layout options and one child will overwrite values from another child From b66b519bd6bbca9e0b1461909a7d050174a1649f Mon Sep 17 00:00:00 2001 From: ricky Date: Tue, 31 May 2016 10:29:21 -0700 Subject: [PATCH 07/10] assert that child is not nil Summary: Test Plan: Reviewers: Subscribers: JIRA Issue(s): Service(s): --- AsyncDisplayKit/Layout/ASLayoutSpec.mm | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/AsyncDisplayKit/Layout/ASLayoutSpec.mm b/AsyncDisplayKit/Layout/ASLayoutSpec.mm index a14a4e1e32..ca4dba8008 100644 --- a/AsyncDisplayKit/Layout/ASLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASLayoutSpec.mm @@ -115,7 +115,8 @@ - (void)setChild:(id)child { ASDisplayNodeAssert(self.isMutable, @"Cannot set properties when layout spec is not mutable"); - + ASDisplayNodeAssertNotNil(child, @"Child cannot be nil"); + id finalLayoutable = [self layoutableToAddFromLayoutable:child]; if (finalLayoutable) { _children = @[finalLayoutable]; @@ -126,6 +127,7 @@ - (void)setChild:(id)child forIdentifier:(NSString *)identifier { ASDisplayNodeAssert(self.isMutable, @"Cannot set properties when layout spec is not mutable"); + ASDisplayNodeAssertNotNil(child, @"Child cannot be nil"); id finalLayoutable = [self layoutableToAddFromLayoutable:child]; self.childrenWithIdentifier[identifier] = finalLayoutable; From 501fed16aa2e798117d773774bdaaa4d0bac17ed Mon Sep 17 00:00:00 2001 From: ricky Date: Thu, 2 Jun 2016 10:32:56 -0700 Subject: [PATCH 08/10] nil out displayContext when we get a new one Summary: Don't set the new one in the subnodes yet as this will cause ASEnvironmentTraitCollectionIsEqualToASEnvironmentTraitCollection to return NO if only the displayContext changed. Reviewers: garrett, levi, rmalik Reviewed By: garrett, levi, rmalik Subscribers: rmalik Differential Revision: https://phabricator.pinadmin.com/D94320 --- AsyncDisplayKit/ASViewController.h | 2 +- AsyncDisplayKit/ASViewController.mm | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/AsyncDisplayKit/ASViewController.h b/AsyncDisplayKit/ASViewController.h index 71a7e4a70c..123669b5c5 100644 --- a/AsyncDisplayKit/ASViewController.h +++ b/AsyncDisplayKit/ASViewController.h @@ -33,7 +33,7 @@ typedef ASTraitCollection * _Nonnull (^ASDisplayTraitsForTraitWindowSizeBlock)(C * ASVC keeps a strong reference to the context to make sure that it stays alive. If you change this value * it will propagate the change to the subnodes. */ -@property (nonatomic, strong) id _Nullable traitColectionContext; +@property (nonatomic, strong) id _Nullable traitCollectionContext; /** * Set this block to customize the ASDisplayTraits returned when the VC transitions to the given traitCollection. diff --git a/AsyncDisplayKit/ASViewController.mm b/AsyncDisplayKit/ASViewController.mm index e575e9ec14..1aef39231e 100644 --- a/AsyncDisplayKit/ASViewController.mm +++ b/AsyncDisplayKit/ASViewController.mm @@ -56,7 +56,7 @@ - (void)dealloc { - if (_traitColectionContext != nil) { + if (_traitCollectionContext != nil) { // The setter will iterate through the VC's subnodes and replace the traitCollectionContext in their ASEnvironmentTraitCollection with nil. // 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 @@ -195,13 +195,14 @@ ASVisibilityDepthImplementation; #pragma mark - ASEnvironmentTraitCollection -- (void)setTraitColectionContext:(id)traitColectionContext +- (void)setTraitColectionContext:(id)traitCollectionContext { - if (_traitColectionContext != traitColectionContext) { - // propagate first so that nodes aren't hanging around with a dealloc'ed pointer - ASEnvironmentTraitCollectionUpdateDisplayContext(self.node, traitColectionContext); + if (_traitCollectionContext != traitCollectionContext) { + // nil out the displayContext in the subnodes so they aren't hanging around with a dealloc'ed pointer don't set + // the new context yet as this will cause ASEnvironmentTraitCollectionIsEqualToASEnvironmentTraitCollection to fail + ASEnvironmentTraitCollectionUpdateDisplayContext(self.node, nil); - _traitColectionContext = traitColectionContext; + _traitCollectionContext = traitCollectionContext; } } @@ -214,7 +215,7 @@ ASVisibilityDepthImplementation; } ASEnvironmentTraitCollection asyncTraitCollection = ASEnvironmentTraitCollectionFromUITraitCollection(traitCollection); - asyncTraitCollection.displayContext = self.traitColectionContext; + asyncTraitCollection.displayContext = self.traitCollectionContext; return asyncTraitCollection; } From 01dbc86778b9ebbd29111665e01a87e6e6a03924 Mon Sep 17 00:00:00 2001 From: ricky Date: Fri, 3 Jun 2016 09:59:24 -0700 Subject: [PATCH 09/10] First pass of comments * make variable naming reflect ASEnvironmentTraitCollection vs ASTraitCollection * move trait propagation to cell allocation instead of via a nested block * move trait propagation when setting a displaynode's supernode instead of when adding a subnode * fixed misspelling of "colection" --- AsyncDisplayKit.xcodeproj/project.pbxproj | 12 +++--- AsyncDisplayKit/ASDisplayNode.mm | 15 +++----- AsyncDisplayKit/ASViewController.mm | 38 +++++++++---------- .../Details/ASCollectionDataController.mm | 12 +++++- AsyncDisplayKit/Details/ASDataController.mm | 35 ++++++++--------- AsyncDisplayKit/Details/ASEnvironment.h | 6 +-- AsyncDisplayKit/Details/ASEnvironment.mm | 10 ++--- .../Details/ASIndexedNodeContext.h | 5 ++- ...dNodeContext.m => ASIndexedNodeContext.mm} | 7 +++- AsyncDisplayKit/Details/ASTraitCollection.h | 2 +- AsyncDisplayKit/Layout/ASLayoutSpec.mm | 8 ++-- .../Private/ASEnvironmentInternal.mm | 4 +- 12 files changed, 84 insertions(+), 70 deletions(-) rename AsyncDisplayKit/Details/{ASIndexedNodeContext.m => ASIndexedNodeContext.mm} (74%) 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; From 13a35c5f2f7addb7a3ddfb1a188119e7eaf4d6e9 Mon Sep 17 00:00:00 2001 From: ricky Date: Fri, 3 Jun 2016 13:59:59 -0700 Subject: [PATCH 10/10] more comments * allow nil for setChild/children * moved examples out of examples/ --- AsyncDisplayKit/ASCollectionNode.mm | 1 + AsyncDisplayKit/ASTableNode.mm | 5 +- AsyncDisplayKit/Details/ASEnvironment.h | 2 +- AsyncDisplayKit/Layout/ASLayoutSpec.mm | 41 +- examples/ASTraitCollection/Podfile | 5 - .../Sample.xcodeproj/project.pbxproj | 385 ------------------ .../contents.xcworkspacedata | 7 - .../xcshareddata/xcschemes/Sample.xcscheme | 88 ---- .../contents.xcworkspacedata | 10 - .../ASTraitCollection/Sample/AppDelegate.h | 20 - .../ASTraitCollection/Sample/AppDelegate.m | 31 -- .../Sample/CollectionViewController.h | 15 - .../Sample/CollectionViewController.m | 73 ---- examples/ASTraitCollection/Sample/Info.plist | 39 -- .../ASTraitCollection/Sample/KittenNode.h | 23 -- .../ASTraitCollection/Sample/KittenNode.m | 168 -------- .../Sample/Launch Screen.storyboard | 50 --- .../Sample/OverrideViewController.h | 29 -- .../Sample/OverrideViewController.m | 97 ----- .../Sample/TableViewController.h | 16 - .../Sample/TableViewController.m | 62 --- .../ASTraitCollection/Sample/ViewController.h | 16 - .../ASTraitCollection/Sample/ViewController.m | 45 -- examples/ASTraitCollection/Sample/main.m | 20 - examples_extra/ASTraitCollection/Podfile | 6 +- .../Sample.xcodeproj/project.pbxproj | 36 +- .../ASTraitCollection/Sample/KittenNode.m | 6 +- 27 files changed, 59 insertions(+), 1237 deletions(-) delete mode 100644 examples/ASTraitCollection/Podfile delete mode 100644 examples/ASTraitCollection/Sample.xcodeproj/project.pbxproj delete mode 100644 examples/ASTraitCollection/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 examples/ASTraitCollection/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme delete mode 100644 examples/ASTraitCollection/Sample.xcworkspace/contents.xcworkspacedata delete mode 100644 examples/ASTraitCollection/Sample/AppDelegate.h delete mode 100644 examples/ASTraitCollection/Sample/AppDelegate.m delete mode 100644 examples/ASTraitCollection/Sample/CollectionViewController.h delete mode 100644 examples/ASTraitCollection/Sample/CollectionViewController.m delete mode 100644 examples/ASTraitCollection/Sample/Info.plist delete mode 100644 examples/ASTraitCollection/Sample/KittenNode.h delete mode 100644 examples/ASTraitCollection/Sample/KittenNode.m delete mode 100644 examples/ASTraitCollection/Sample/Launch Screen.storyboard delete mode 100644 examples/ASTraitCollection/Sample/OverrideViewController.h delete mode 100644 examples/ASTraitCollection/Sample/OverrideViewController.m delete mode 100644 examples/ASTraitCollection/Sample/TableViewController.h delete mode 100644 examples/ASTraitCollection/Sample/TableViewController.m delete mode 100644 examples/ASTraitCollection/Sample/ViewController.h delete mode 100644 examples/ASTraitCollection/Sample/ViewController.m delete mode 100644 examples/ASTraitCollection/Sample/main.m diff --git a/AsyncDisplayKit/ASCollectionNode.mm b/AsyncDisplayKit/ASCollectionNode.mm index e5c7880f48..a29ee08cf2 100644 --- a/AsyncDisplayKit/ASCollectionNode.mm +++ b/AsyncDisplayKit/ASCollectionNode.mm @@ -11,6 +11,7 @@ #import "ASCollectionViewLayoutFacilitatorProtocol.h" #import "ASDisplayNode+Subclasses.h" #import "ASEnvironmentInternal.h" +#import "ASInternalHelpers.h" #import "ASRangeControllerUpdateRangeProtocol+Beta.h" #include diff --git a/AsyncDisplayKit/ASTableNode.mm b/AsyncDisplayKit/ASTableNode.mm index 7b413bc588..1642478d2d 100644 --- a/AsyncDisplayKit/ASTableNode.mm +++ b/AsyncDisplayKit/ASTableNode.mm @@ -7,10 +7,11 @@ // #import "ASEnvironmentInternal.h" -#import "ASFlowLayoutController.h" -#import "ASTableViewInternal.h" #import "ASDisplayNode+Subclasses.h" +#import "ASFlowLayoutController.h" +#import "ASInternalHelpers.h" #import "ASRangeControllerUpdateRangeProtocol+Beta.h" +#import "ASTableViewInternal.h" @interface _ASTablePendingState : NSObject @property (weak, nonatomic) id delegate; diff --git a/AsyncDisplayKit/Details/ASEnvironment.h b/AsyncDisplayKit/Details/ASEnvironment.h index 5e0233a702..16b71a9b65 100644 --- a/AsyncDisplayKit/Details/ASEnvironment.h +++ b/AsyncDisplayKit/Details/ASEnvironment.h @@ -156,7 +156,7 @@ ASDISPLAYNODE_EXTERN_C_END [super setEnvironmentState:environmentState];\ ASEnvironmentTraitCollection currentTraits = environmentState.environmentTraitCollection;\ if (ASEnvironmentTraitCollectionIsEqualToASEnvironmentTraitCollection(currentTraits, oldTraits) == NO) {\ - dispatch_async(dispatch_get_main_queue(), ^{\ + ASPerformBlockOnMainThread(^{\ NSArray *> *completedNodes = [self.view.dataController completedNodes];\ for (NSArray *sectionArray in completedNodes) {\ for (ASCellNode *cellNode in sectionArray) {\ diff --git a/AsyncDisplayKit/Layout/ASLayoutSpec.mm b/AsyncDisplayKit/Layout/ASLayoutSpec.mm index 79194fa7a1..af46b53842 100644 --- a/AsyncDisplayKit/Layout/ASLayoutSpec.mm +++ b/AsyncDisplayKit/Layout/ASLayoutSpec.mm @@ -44,7 +44,7 @@ } _isMutable = YES; _environmentState = ASEnvironmentStateMakeDefault(); - + _children = [NSArray array]; return self; } @@ -115,24 +115,35 @@ - (void)setChild:(id)child { ASDisplayNodeAssert(self.isMutable, @"Cannot set properties when layout spec is not mutable"); - ASDisplayNodeAssertNotNil(child, @"Child cannot be nil"); - - id finalLayoutable = [self layoutableToAddFromLayoutable:child]; - if (finalLayoutable) { - _children = @[finalLayoutable]; - [self propagateUpLayoutable:finalLayoutable]; + if (child) { + id finalLayoutable = [self layoutableToAddFromLayoutable:child]; + if (finalLayoutable) { + _children = @[finalLayoutable]; + [self propagateUpLayoutable:finalLayoutable]; + } + } else { + // remove the only child + _children = [NSArray array]; } } - (void)setChild:(id)child forIdentifier:(NSString *)identifier { ASDisplayNodeAssert(self.isMutable, @"Cannot set properties when layout spec is not mutable"); - ASDisplayNodeAssertNotNil(child, @"Child cannot be nil"); - - id finalLayoutable = [self layoutableToAddFromLayoutable:child]; - self.childrenWithIdentifier[identifier] = finalLayoutable; - if (finalLayoutable) { - self.children = [self.children arrayByAddingObject:finalLayoutable]; + if (child) { + id finalLayoutable = [self layoutableToAddFromLayoutable:child]; + self.childrenWithIdentifier[identifier] = finalLayoutable; + if (finalLayoutable) { + _children = [_children arrayByAddingObject:finalLayoutable]; + } + } else { + id oldChild = self.childrenWithIdentifier[identifier]; + if (oldChild) { + self.childrenWithIdentifier[identifier] = nil; + NSMutableArray *mutableChildren = [_children mutableCopy]; + [mutableChildren removeObject:oldChild]; + _children = [mutableChildren copy]; + } } // TODO: Should we propagate up the layoutable at it could happen that multiple children will propagated up their @@ -152,6 +163,8 @@ _children = nil; if (finalChildren.size() > 0) { _children = [NSArray arrayWithObjects:&finalChildren[0] count:finalChildren.size()]; + } else { + _children = [NSArray array]; } } @@ -167,7 +180,7 @@ - (NSArray *)children { - return [_children copy]; + return _children; } - (void)setTraitCollection:(ASTraitCollection *)traitCollection diff --git a/examples/ASTraitCollection/Podfile b/examples/ASTraitCollection/Podfile deleted file mode 100644 index 919de4b311..0000000000 --- a/examples/ASTraitCollection/Podfile +++ /dev/null @@ -1,5 +0,0 @@ -source 'https://github.com/CocoaPods/Specs.git' -platform :ios, '7.0' -target 'Sample' do - pod 'AsyncDisplayKit', :path => '../..' -end diff --git a/examples/ASTraitCollection/Sample.xcodeproj/project.pbxproj b/examples/ASTraitCollection/Sample.xcodeproj/project.pbxproj deleted file mode 100644 index f9e679bb36..0000000000 --- a/examples/ASTraitCollection/Sample.xcodeproj/project.pbxproj +++ /dev/null @@ -1,385 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 05E2128719D4DB510098F589 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 05E2128619D4DB510098F589 /* main.m */; }; - 05E2128A19D4DB510098F589 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 05E2128919D4DB510098F589 /* AppDelegate.m */; }; - 05E2128D19D4DB510098F589 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 05E2128C19D4DB510098F589 /* ViewController.m */; }; - 1BEECAB53F4B61DCB949ED44 /* libPods-Sample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEDFC574739077BA65E0CF5 /* libPods-Sample.a */; }; - 9C37D01E1CC94BC9004C8BC1 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9C37D01D1CC94BC9004C8BC1 /* Launch Screen.storyboard */; }; - 9CACC7811CCEAF9E009A1613 /* TableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CACC7801CCEAF9E009A1613 /* TableViewController.m */; }; - 9CACC7841CCEAFAE009A1613 /* CollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CACC7831CCEAFAE009A1613 /* CollectionViewController.m */; }; - 9CACC7871CCEBD3B009A1613 /* KittenNode.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CACC7861CCEBD3B009A1613 /* KittenNode.m */; }; - 9CACC78A1CCEC82C009A1613 /* OverrideViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CACC7891CCEC82C009A1613 /* OverrideViewController.m */; }; -/* End PBXBuildFile section */ - -/* Begin PBXFileReference section */ - 056298286C03B7760575CC56 /* Pods-Sample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Sample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Sample/Pods-Sample.debug.xcconfig"; sourceTree = ""; }; - 05E2128119D4DB510098F589 /* Sample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Sample.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 05E2128519D4DB510098F589 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 05E2128619D4DB510098F589 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 05E2128819D4DB510098F589 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; - 05E2128919D4DB510098F589 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; - 05E2128B19D4DB510098F589 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; - 05E2128C19D4DB510098F589 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; - 088AA6578212BE9BFBB07B70 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; - 1EEDFC574739077BA65E0CF5 /* libPods-Sample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Sample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; - 3D24B17D1E4A4E7A9566C5E9 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; - 9C37D01D1CC94BC9004C8BC1 /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; - 9CACC77F1CCEAF9E009A1613 /* TableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TableViewController.h; sourceTree = ""; }; - 9CACC7801CCEAF9E009A1613 /* TableViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TableViewController.m; sourceTree = ""; }; - 9CACC7821CCEAFAE009A1613 /* CollectionViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CollectionViewController.h; sourceTree = ""; }; - 9CACC7831CCEAFAE009A1613 /* CollectionViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CollectionViewController.m; sourceTree = ""; }; - 9CACC7851CCEBD3B009A1613 /* KittenNode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KittenNode.h; sourceTree = ""; }; - 9CACC7861CCEBD3B009A1613 /* KittenNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KittenNode.m; sourceTree = ""; }; - 9CACC7881CCEC82C009A1613 /* OverrideViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OverrideViewController.h; sourceTree = ""; }; - 9CACC7891CCEC82C009A1613 /* OverrideViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OverrideViewController.m; sourceTree = ""; }; - A7F0013FBBCBEA0C9FB68986 /* Pods-Sample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Sample.release.xcconfig"; path = "Pods/Target Support Files/Pods-Sample/Pods-Sample.release.xcconfig"; sourceTree = ""; }; - C068F1D3F0CC317E895FCDAB /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 05E2127E19D4DB510098F589 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 1BEECAB53F4B61DCB949ED44 /* libPods-Sample.a in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 05E2127819D4DB510098F589 = { - isa = PBXGroup; - children = ( - 05E2128319D4DB510098F589 /* Sample */, - 05E2128219D4DB510098F589 /* Products */, - 1A943BF0259746F18D6E423F /* Frameworks */, - 1AE410B73DA5C3BD087ACDD7 /* Pods */, - ); - indentWidth = 2; - sourceTree = ""; - tabWidth = 2; - usesTabs = 0; - }; - 05E2128219D4DB510098F589 /* Products */ = { - isa = PBXGroup; - children = ( - 05E2128119D4DB510098F589 /* Sample.app */, - ); - name = Products; - sourceTree = ""; - }; - 05E2128319D4DB510098F589 /* Sample */ = { - isa = PBXGroup; - children = ( - 05E2128819D4DB510098F589 /* AppDelegate.h */, - 05E2128919D4DB510098F589 /* AppDelegate.m */, - 05E2128B19D4DB510098F589 /* ViewController.h */, - 05E2128C19D4DB510098F589 /* ViewController.m */, - 05E2128419D4DB510098F589 /* Supporting Files */, - 9CACC77F1CCEAF9E009A1613 /* TableViewController.h */, - 9CACC7801CCEAF9E009A1613 /* TableViewController.m */, - 9CACC7821CCEAFAE009A1613 /* CollectionViewController.h */, - 9CACC7831CCEAFAE009A1613 /* CollectionViewController.m */, - 9CACC7851CCEBD3B009A1613 /* KittenNode.h */, - 9CACC7861CCEBD3B009A1613 /* KittenNode.m */, - 9CACC7881CCEC82C009A1613 /* OverrideViewController.h */, - 9CACC7891CCEC82C009A1613 /* OverrideViewController.m */, - ); - path = Sample; - sourceTree = ""; - }; - 05E2128419D4DB510098F589 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 05E2128519D4DB510098F589 /* Info.plist */, - 05E2128619D4DB510098F589 /* main.m */, - 9C37D01D1CC94BC9004C8BC1 /* Launch Screen.storyboard */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 1A943BF0259746F18D6E423F /* Frameworks */ = { - isa = PBXGroup; - children = ( - 3D24B17D1E4A4E7A9566C5E9 /* libPods.a */, - 1EEDFC574739077BA65E0CF5 /* libPods-Sample.a */, - ); - name = Frameworks; - sourceTree = ""; - }; - 1AE410B73DA5C3BD087ACDD7 /* Pods */ = { - isa = PBXGroup; - children = ( - C068F1D3F0CC317E895FCDAB /* Pods.debug.xcconfig */, - 088AA6578212BE9BFBB07B70 /* Pods.release.xcconfig */, - 056298286C03B7760575CC56 /* Pods-Sample.debug.xcconfig */, - A7F0013FBBCBEA0C9FB68986 /* Pods-Sample.release.xcconfig */, - ); - name = Pods; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 05E2128019D4DB510098F589 /* Sample */ = { - isa = PBXNativeTarget; - buildConfigurationList = 05E212A419D4DB510098F589 /* Build configuration list for PBXNativeTarget "Sample" */; - buildPhases = ( - E080B80F89C34A25B3488E26 /* 📦 Check Pods Manifest.lock */, - 05E2127D19D4DB510098F589 /* Sources */, - 05E2127E19D4DB510098F589 /* Frameworks */, - 05E2127F19D4DB510098F589 /* Resources */, - F012A6F39E0149F18F564F50 /* 📦 Copy Pods Resources */, - FFF65E837E66ADA71296F0FF /* 📦 Embed Pods Frameworks */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Sample; - productName = Sample; - productReference = 05E2128119D4DB510098F589 /* Sample.app */; - productType = "com.apple.product-type.application"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 05E2127919D4DB510098F589 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0600; - ORGANIZATIONNAME = Facebook; - TargetAttributes = { - 05E2128019D4DB510098F589 = { - CreatedOnToolsVersion = 6.0.1; - }; - }; - }; - buildConfigurationList = 05E2127C19D4DB510098F589 /* Build configuration list for PBXProject "Sample" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - Base, - ); - mainGroup = 05E2127819D4DB510098F589; - productRefGroup = 05E2128219D4DB510098F589 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 05E2128019D4DB510098F589 /* Sample */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 05E2127F19D4DB510098F589 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 9C37D01E1CC94BC9004C8BC1 /* Launch Screen.storyboard in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXShellScriptBuildPhase section */ - E080B80F89C34A25B3488E26 /* 📦 Check Pods Manifest.lock */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "📦 Check Pods Manifest.lock"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; - showEnvVarsInLog = 0; - }; - F012A6F39E0149F18F564F50 /* 📦 Copy Pods Resources */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "📦 Copy Pods Resources"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Sample/Pods-Sample-resources.sh\"\n"; - showEnvVarsInLog = 0; - }; - FFF65E837E66ADA71296F0FF /* 📦 Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "📦 Embed Pods Frameworks"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Sample/Pods-Sample-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 05E2127D19D4DB510098F589 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 05E2128D19D4DB510098F589 /* ViewController.m in Sources */, - 9CACC78A1CCEC82C009A1613 /* OverrideViewController.m in Sources */, - 05E2128A19D4DB510098F589 /* AppDelegate.m in Sources */, - 05E2128719D4DB510098F589 /* main.m in Sources */, - 9CACC7841CCEAFAE009A1613 /* CollectionViewController.m in Sources */, - 9CACC7871CCEBD3B009A1613 /* KittenNode.m in Sources */, - 9CACC7811CCEAF9E009A1613 /* TableViewController.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 05E212A219D4DB510098F589 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - }; - name = Debug; - }; - 05E212A319D4DB510098F589 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 05E212A519D4DB510098F589 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 056298286C03B7760575CC56 /* Pods-Sample.debug.xcconfig */; - buildSettings = { - INFOPLIST_FILE = Sample/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 05E212A619D4DB510098F589 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = A7F0013FBBCBEA0C9FB68986 /* Pods-Sample.release.xcconfig */; - buildSettings = { - INFOPLIST_FILE = Sample/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 05E2127C19D4DB510098F589 /* Build configuration list for PBXProject "Sample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 05E212A219D4DB510098F589 /* Debug */, - 05E212A319D4DB510098F589 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 05E212A419D4DB510098F589 /* Build configuration list for PBXNativeTarget "Sample" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 05E212A519D4DB510098F589 /* Debug */, - 05E212A619D4DB510098F589 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 05E2127919D4DB510098F589 /* Project object */; -} diff --git a/examples/ASTraitCollection/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/examples/ASTraitCollection/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index a80c038249..0000000000 --- a/examples/ASTraitCollection/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/examples/ASTraitCollection/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme b/examples/ASTraitCollection/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme deleted file mode 100644 index 1e14aa0329..0000000000 --- a/examples/ASTraitCollection/Sample.xcodeproj/xcshareddata/xcschemes/Sample.xcscheme +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ASTraitCollection/Sample.xcworkspace/contents.xcworkspacedata b/examples/ASTraitCollection/Sample.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 7b5a2f3050..0000000000 --- a/examples/ASTraitCollection/Sample.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - diff --git a/examples/ASTraitCollection/Sample/AppDelegate.h b/examples/ASTraitCollection/Sample/AppDelegate.h deleted file mode 100644 index 85855277e9..0000000000 --- a/examples/ASTraitCollection/Sample/AppDelegate.h +++ /dev/null @@ -1,20 +0,0 @@ -/* This file provided by Facebook is for non-commercial testing and evaluation - * purposes only. Facebook reserves all rights not expressly granted. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -#define UseAutomaticLayout 1 - -@interface AppDelegate : UIResponder - -@property (strong, nonatomic) UIWindow *window; - -@end diff --git a/examples/ASTraitCollection/Sample/AppDelegate.m b/examples/ASTraitCollection/Sample/AppDelegate.m deleted file mode 100644 index 63928f1c38..0000000000 --- a/examples/ASTraitCollection/Sample/AppDelegate.m +++ /dev/null @@ -1,31 +0,0 @@ -/* This file provided by Facebook is for non-commercial testing and evaluation - * purposes only. Facebook reserves all rights not expressly granted. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#import "AppDelegate.h" - -#import "ViewController.h" -#import "TableViewController.h" -#import "CollectionViewController.h" - -@implementation AppDelegate - -- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions -{ - self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; - self.window.backgroundColor = [UIColor whiteColor]; - UITabBarController *tabController = [[UITabBarController alloc] init]; - [tabController setViewControllers:@[[[ViewController alloc] init], [[TableViewController alloc] init], [[CollectionViewController alloc] init]]]; - self.window.rootViewController = tabController; - [self.window makeKeyAndVisible]; - return YES; -} - -@end diff --git a/examples/ASTraitCollection/Sample/CollectionViewController.h b/examples/ASTraitCollection/Sample/CollectionViewController.h deleted file mode 100644 index 613cf835e4..0000000000 --- a/examples/ASTraitCollection/Sample/CollectionViewController.h +++ /dev/null @@ -1,15 +0,0 @@ -/* This file provided by Facebook is for non-commercial testing and evaluation - * purposes only. Facebook reserves all rights not expressly granted. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -@interface CollectionViewController : ASViewController -@end diff --git a/examples/ASTraitCollection/Sample/CollectionViewController.m b/examples/ASTraitCollection/Sample/CollectionViewController.m deleted file mode 100644 index 532b43e051..0000000000 --- a/examples/ASTraitCollection/Sample/CollectionViewController.m +++ /dev/null @@ -1,73 +0,0 @@ -/* This file provided by Facebook is for non-commercial testing and evaluation - * purposes only. Facebook reserves all rights not expressly granted. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#import "CollectionViewController.h" -#import "KittenNode.h" -#import - -@interface CollectionViewController () -@property (nonatomic, strong) ASCollectionNode *collectionNode; -@end - -@implementation CollectionViewController - -- (instancetype)init -{ - UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; - layout.minimumLineSpacing = 10; - layout.minimumInteritemSpacing = 10; - - ASCollectionNode *collectionNode = [[ASCollectionNode alloc] initWithCollectionViewLayout:layout]; - - if (!(self = [super initWithNode:collectionNode])) - return nil; - - self.title = @"Collection Node"; - _collectionNode = collectionNode; - collectionNode.dataSource = self; - collectionNode.delegate = self; - return self; -} - -- (void)viewDidLoad -{ - [super viewDidLoad]; - self.collectionNode.view.contentInset = UIEdgeInsetsMake(20, 10, CGRectGetHeight(self.tabBarController.tabBar.frame), 10); -} - -#pragma mark - ASCollectionDataSource - -- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section -{ - return 50; -} - -- (ASCellNode *)collectionView:(ASCollectionView *)collectionView nodeForItemAtIndexPath:(NSIndexPath *)indexPath -{ - KittenNode *cell = [[KittenNode alloc] init]; - cell.textNode.maximumNumberOfLines = 3; - cell.imageTappedBlock = ^{ - [KittenNode defaultImageTappedAction:self]; - }; - return cell; -} - -- (ASSizeRange)collectionView:(ASCollectionView *)collectionView constrainedSizeForNodeAtIndexPath:(NSIndexPath *)indexPath -{ - ASTraitCollection *traitCollection = [self.collectionNode asyncTraitCollection]; - - if (traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) { - return ASSizeRangeMake(CGSizeMake(200, 120), CGSizeMake(200, 120)); - } - return ASSizeRangeMake(CGSizeMake(132, 180), CGSizeMake(132, 180)); -} - -@end diff --git a/examples/ASTraitCollection/Sample/Info.plist b/examples/ASTraitCollection/Sample/Info.plist deleted file mode 100644 index acc713cc71..0000000000 --- a/examples/ASTraitCollection/Sample/Info.plist +++ /dev/null @@ -1,39 +0,0 @@ - - - - - CFBundleDevelopmentRegion - en - CFBundleExecutable - $(EXECUTABLE_NAME) - CFBundleIdentifier - com.facebook.AsyncDisplayKit.$(PRODUCT_NAME:rfc1034identifier) - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - $(PRODUCT_NAME) - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1 - LSRequiresIPhoneOS - - UILaunchStoryboardName - Launch Screen - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationPortraitUpsideDown - - - diff --git a/examples/ASTraitCollection/Sample/KittenNode.h b/examples/ASTraitCollection/Sample/KittenNode.h deleted file mode 100644 index ae73a8900b..0000000000 --- a/examples/ASTraitCollection/Sample/KittenNode.h +++ /dev/null @@ -1,23 +0,0 @@ -/* This file provided by Facebook is for non-commercial testing and evaluation - * purposes only. Facebook reserves all rights not expressly granted. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -@interface KittenNode : ASCellNode -@property (nonatomic, strong, readonly) ASNetworkImageNode *imageNode; -@property (nonatomic, strong, readonly) ASTextNode *textNode; - -@property (nonatomic, copy) dispatch_block_t imageTappedBlock; - -// The default action when an image node is tapped. This action will create an -// OverrideVC and override its display traits to always be compact. -+ (void)defaultImageTappedAction:(ASViewController *)sourceViewController; -@end diff --git a/examples/ASTraitCollection/Sample/KittenNode.m b/examples/ASTraitCollection/Sample/KittenNode.m deleted file mode 100644 index 18babcdc36..0000000000 --- a/examples/ASTraitCollection/Sample/KittenNode.m +++ /dev/null @@ -1,168 +0,0 @@ -/* This file provided by Facebook is for non-commercial testing and evaluation - * purposes only. Facebook reserves all rights not expressly granted. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#import "KittenNode.h" -#import "OverrideViewController.h" - -#import - -static const CGFloat kOuterPadding = 16.0f; -static const CGFloat kInnerPadding = 10.0f; - -@interface KittenNode () -{ - CGSize _kittenSize; -} - -@end - - -@implementation KittenNode - -// lorem ipsum text courtesy https://kittyipsum.com/ <3 -+ (NSArray *)placeholders -{ - static NSArray *placeholders = nil; - - static dispatch_once_t once; - dispatch_once(&once, ^{ - placeholders = @[ - @"Kitty ipsum dolor sit amet, purr sleep on your face lay down in your way biting, sniff tincidunt a etiam fluffy fur judging you stuck in a tree kittens.", - @"Lick tincidunt a biting eat the grass, egestas enim ut lick leap puking climb the curtains lick.", - @"Lick quis nunc toss the mousie vel, tortor pellentesque sunbathe orci turpis non tail flick suscipit sleep in the sink.", - @"Orci turpis litter box et stuck in a tree, egestas ac tempus et aliquam elit.", - @"Hairball iaculis dolor dolor neque, nibh adipiscing vehicula egestas dolor aliquam.", - @"Sunbathe fluffy fur tortor faucibus pharetra jump, enim jump on the table I don't like that food catnip toss the mousie scratched.", - @"Quis nunc nam sleep in the sink quis nunc purr faucibus, chase the red dot consectetur bat sagittis.", - @"Lick tail flick jump on the table stretching purr amet, rhoncus scratched jump on the table run.", - @"Suspendisse aliquam vulputate feed me sleep on your keyboard, rip the couch faucibus sleep on your keyboard tristique give me fish dolor.", - @"Rip the couch hiss attack your ankles biting pellentesque puking, enim suspendisse enim mauris a.", - @"Sollicitudin iaculis vestibulum toss the mousie biting attack your ankles, puking nunc jump adipiscing in viverra.", - @"Nam zzz amet neque, bat tincidunt a iaculis sniff hiss bibendum leap nibh.", - @"Chase the red dot enim puking chuf, tristique et egestas sniff sollicitudin pharetra enim ut mauris a.", - @"Sagittis scratched et lick, hairball leap attack adipiscing catnip tail flick iaculis lick.", - @"Neque neque sleep in the sink neque sleep on your face, climb the curtains chuf tail flick sniff tortor non.", - @"Ac etiam kittens claw toss the mousie jump, pellentesque rhoncus litter box give me fish adipiscing mauris a.", - @"Pharetra egestas sunbathe faucibus ac fluffy fur, hiss feed me give me fish accumsan.", - @"Tortor leap tristique accumsan rutrum sleep in the sink, amet sollicitudin adipiscing dolor chase the red dot.", - @"Knock over the lamp pharetra vehicula sleep on your face rhoncus, jump elit cras nec quis quis nunc nam.", - @"Sollicitudin feed me et ac in viverra catnip, nunc eat I don't like that food iaculis give me fish.", - ]; - }); - - return placeholders; -} - -- (instancetype)init -{ - if (!(self = [super init])) - return nil; - - _kittenSize = CGSizeMake(100,100); - - // kitten image, with a solid background colour serving as placeholder - _imageNode = [[ASNetworkImageNode alloc] init]; - _imageNode.backgroundColor = ASDisplayNodeDefaultPlaceholderColor(); - _imageNode.preferredFrameSize = _kittenSize; - [_imageNode addTarget:self action:@selector(imageTapped:) forControlEvents:ASControlNodeEventTouchUpInside]; - - CGFloat scale = [UIScreen mainScreen].scale; - _imageNode.URL = [NSURL URLWithString:[NSString stringWithFormat:@"https://placekitten.com/%zd/%zd?image=%zd", - (NSInteger)roundl(_kittenSize.width * scale), - (NSInteger)roundl(_kittenSize.height * scale), - (NSInteger)arc4random_uniform(20)]]; - [self addSubnode:_imageNode]; - - // lorem ipsum text, plus some nice styling - _textNode = [[ASTextNode alloc] init]; - _textNode.attributedString = [[NSAttributedString alloc] initWithString:[self kittyIpsum] - attributes:[self textStyle]]; - _textNode.flexShrink = YES; - _textNode.flexGrow = YES; - [self addSubnode:_textNode]; - - return self; -} - -- (void)imageTapped:(id)sender -{ - if (self.imageTappedBlock) { - self.imageTappedBlock(); - } -} - -- (NSString *)kittyIpsum -{ - NSArray *placeholders = [KittenNode placeholders]; - u_int32_t ipsumCount = (u_int32_t)[placeholders count]; - u_int32_t location = arc4random_uniform(ipsumCount); - u_int32_t length = arc4random_uniform(ipsumCount - location); - - NSMutableString *string = [placeholders[location] mutableCopy]; - for (u_int32_t i = location + 1; i < location + length; i++) { - [string appendString:(i % 2 == 0) ? @"\n" : @" "]; - [string appendString:placeholders[i]]; - } - - return string; -} - -- (NSDictionary *)textStyle -{ - UIFont *font = [UIFont fontWithName:@"HelveticaNeue" size:12.0f]; - - NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; - style.paragraphSpacing = 0.5 * font.lineHeight; - style.hyphenationFactor = 1.0; - - return @{ NSFontAttributeName: font, - NSParagraphStyleAttributeName: style, - ASTextNodeWordKerningAttributeName : @.5}; -} - -- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize -{ - ASStackLayoutSpec *stackSpec = [[ASStackLayoutSpec alloc] init]; - stackSpec.spacing = kInnerPadding; - [stackSpec setChildren:@[_imageNode, _textNode]]; - - if (self.asyncTraitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) { - _imageNode.alignSelf = ASStackLayoutAlignSelfStart; - stackSpec.direction = ASStackLayoutDirectionHorizontal; - } else { - _imageNode.alignSelf = ASStackLayoutAlignSelfCenter; - stackSpec.direction = ASStackLayoutDirectionVertical; - } - - return [ASInsetLayoutSpec insetLayoutSpecWithInsets:UIEdgeInsetsMake(kOuterPadding, kOuterPadding, kOuterPadding, kOuterPadding) child:stackSpec]; -} - -+ (void)defaultImageTappedAction:(ASViewController *)sourceViewController -{ - OverrideViewController *overrideVC = [[OverrideViewController alloc] init]; - - overrideVC.overrideDisplayTraitsWithTraitCollection = ^(UITraitCollection *traitCollection) { - ASTraitCollection *asyncTraitCollection = [ASTraitCollection traitCollectionWithDisplayScale:traitCollection.displayScale - userInterfaceIdiom:traitCollection.userInterfaceIdiom - horizontalSizeClass:UIUserInterfaceSizeClassCompact - verticalSizeClass:UIUserInterfaceSizeClassCompact - forceTouchCapability:traitCollection.forceTouchCapability - traitCollectionContext:nil]; - return asyncTraitCollection; - }; - - [sourceViewController presentViewController:overrideVC animated:YES completion:nil]; - overrideVC.closeBlock = ^{ - [sourceViewController dismissViewControllerAnimated:YES completion:nil]; - }; -} - -@end diff --git a/examples/ASTraitCollection/Sample/Launch Screen.storyboard b/examples/ASTraitCollection/Sample/Launch Screen.storyboard deleted file mode 100644 index 95c8ef474d..0000000000 --- a/examples/ASTraitCollection/Sample/Launch Screen.storyboard +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/examples/ASTraitCollection/Sample/OverrideViewController.h b/examples/ASTraitCollection/Sample/OverrideViewController.h deleted file mode 100644 index 9d9e69d839..0000000000 --- a/examples/ASTraitCollection/Sample/OverrideViewController.h +++ /dev/null @@ -1,29 +0,0 @@ -/* This file provided by Facebook is for non-commercial testing and evaluation - * purposes only. Facebook reserves all rights not expressly granted. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -/* - * A simple node that displays the attribution for the kitties in the app. Note that - * for a regular horizontal size class it does something stupid and sets the font size to 100. - * It's VC, OverrideViewController, will have its display traits overridden such that - * it will always have a compact horizontal size class. - */ -@interface OverrideNode : ASDisplayNode -@end - -/* - * This is a fairly stupid VC that's main purpose is to show how to override ASDisplayTraits. - * Take a look at `defaultImageTappedAction` in KittenNode to see how this is accomplished. - */ -@interface OverrideViewController : ASViewController -@property (nonatomic, copy) dispatch_block_t closeBlock; -@end diff --git a/examples/ASTraitCollection/Sample/OverrideViewController.m b/examples/ASTraitCollection/Sample/OverrideViewController.m deleted file mode 100644 index e9f2b957f1..0000000000 --- a/examples/ASTraitCollection/Sample/OverrideViewController.m +++ /dev/null @@ -1,97 +0,0 @@ -/* This file provided by Facebook is for non-commercial testing and evaluation - * purposes only. Facebook reserves all rights not expressly granted. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#import "OverrideViewController.h" -#import - -static NSString *kLinkAttributeName = @"PlaceKittenNodeLinkAttributeName"; - -@interface OverrideNode() -@property (nonatomic, strong) ASTextNode *textNode; -@property (nonatomic, strong) ASButtonNode *buttonNode; -@end - -@implementation OverrideNode - -- (instancetype)init -{ - if (!(self = [super init])) - return nil; - - _textNode = [[ASTextNode alloc] init]; - _textNode.flexGrow = YES; - _textNode.flexShrink = YES; - _textNode.maximumNumberOfLines = 3; - [self addSubnode:_textNode]; - - _buttonNode = [[ASButtonNode alloc] init]; - [_buttonNode setAttributedTitle:[[NSAttributedString alloc] initWithString:@"Close"] forState:ASControlStateNormal]; - [self addSubnode:_buttonNode]; - - self.backgroundColor = [UIColor lightGrayColor]; - - return self; -} - -- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize -{ - CGFloat pointSize = 16.f; - ASTraitCollection *traitCollection = [self asyncTraitCollection]; - if (traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) { - // This should never happen because we override the VC's display traits to always be compact. - pointSize = 100; - } - - NSString *blurb = @"kittens courtesy placekitten.com"; - NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:blurb]; - [string addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"HelveticaNeue" size:pointSize] range:NSMakeRange(0, blurb.length)]; - [string addAttributes:@{ - kLinkAttributeName: [NSURL URLWithString:@"http://placekitten.com/"], - NSForegroundColorAttributeName: [UIColor grayColor], - NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle | NSUnderlinePatternDot), - } - range:[blurb rangeOfString:@"placekitten.com"]]; - - _textNode.attributedString = string; - - ASStackLayoutSpec *stackSpec = [ASStackLayoutSpec verticalStackLayoutSpec]; - [stackSpec setChildren:@[_textNode, _buttonNode]]; - stackSpec.spacing = 10; - return [ASInsetLayoutSpec insetLayoutSpecWithInsets:UIEdgeInsetsMake(40, 20, 20, 20) child:stackSpec]; -} - -@end - -@interface OverrideViewController () - -@end - -@implementation OverrideViewController - -- (instancetype)init -{ - OverrideNode *overrideNode = [[OverrideNode alloc] init]; - - if (!(self = [super initWithNode:overrideNode])) - return nil; - - [overrideNode.buttonNode addTarget:self action:@selector(closeTapped:) forControlEvents:ASControlNodeEventTouchUpInside]; - return self; -} - -- (void)closeTapped:(id)sender -{ - if (self.closeBlock) { - self.closeBlock(); - } -} - -@end diff --git a/examples/ASTraitCollection/Sample/TableViewController.h b/examples/ASTraitCollection/Sample/TableViewController.h deleted file mode 100644 index 364dde8597..0000000000 --- a/examples/ASTraitCollection/Sample/TableViewController.h +++ /dev/null @@ -1,16 +0,0 @@ -/* This file provided by Facebook is for non-commercial testing and evaluation - * purposes only. Facebook reserves all rights not expressly granted. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -@interface TableViewController : ASViewController - -@end diff --git a/examples/ASTraitCollection/Sample/TableViewController.m b/examples/ASTraitCollection/Sample/TableViewController.m deleted file mode 100644 index bd897a7c75..0000000000 --- a/examples/ASTraitCollection/Sample/TableViewController.m +++ /dev/null @@ -1,62 +0,0 @@ -/* This file provided by Facebook is for non-commercial testing and evaluation - * purposes only. Facebook reserves all rights not expressly granted. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#import "TableViewController.h" -#import "KittenNode.h" - -@interface TableViewController () -@property (nonatomic, strong) ASTableNode *tableNode; -@end - -@implementation TableViewController - -- (instancetype)init -{ - ASTableNode *tableNode = [[ASTableNode alloc] init]; - if (!(self = [super initWithNode:tableNode])) - return nil; - - _tableNode = tableNode; - tableNode.delegate = self; - tableNode.dataSource = self; - self.title = @"Table Node"; - return self; -} - -- (void)viewDidLoad -{ - [super viewDidLoad]; - self.tableNode.view.contentInset = UIEdgeInsetsMake(CGRectGetHeight([[UIApplication sharedApplication] statusBarFrame]), 0, CGRectGetHeight(self.tabBarController.tabBar.frame), 0); -} - -#pragma mark - -#pragma mark ASTableView. - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath -{ - [tableView deselectRowAtIndexPath:indexPath animated:YES]; -} - -- (ASCellNode *)tableView:(ASTableView *)tableView nodeForRowAtIndexPath:(NSIndexPath *)indexPath -{ - KittenNode *cell = [[KittenNode alloc] init]; - cell.imageTappedBlock = ^{ - [KittenNode defaultImageTappedAction:self]; - }; - return cell; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section -{ - return 15; -} - -@end diff --git a/examples/ASTraitCollection/Sample/ViewController.h b/examples/ASTraitCollection/Sample/ViewController.h deleted file mode 100644 index aa1d583729..0000000000 --- a/examples/ASTraitCollection/Sample/ViewController.h +++ /dev/null @@ -1,16 +0,0 @@ -/* This file provided by Facebook is for non-commercial testing and evaluation - * purposes only. Facebook reserves all rights not expressly granted. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -@interface ViewController : ASViewController - -@end diff --git a/examples/ASTraitCollection/Sample/ViewController.m b/examples/ASTraitCollection/Sample/ViewController.m deleted file mode 100644 index 42e9cb9a4a..0000000000 --- a/examples/ASTraitCollection/Sample/ViewController.m +++ /dev/null @@ -1,45 +0,0 @@ -/* This file provided by Facebook is for non-commercial testing and evaluation - * purposes only. Facebook reserves all rights not expressly granted. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#import "ViewController.h" -#import "KittenNode.h" -#import "OverrideViewController.h" - -#import -#import - -@interface ViewController () -@end - -@implementation ViewController - -#pragma mark - -#pragma mark UIViewController. - -- (instancetype)init -{ - KittenNode *displayNode = [[KittenNode alloc] init]; - if (!(self = [super initWithNode:displayNode])) - return nil; - - self.title = @"Display Node"; - displayNode.imageTappedBlock = ^{ - [KittenNode defaultImageTappedAction:self]; - }; - return self; -} - -- (void)viewWillLayoutSubviews -{ - [super viewWillLayoutSubviews]; -} - -@end diff --git a/examples/ASTraitCollection/Sample/main.m b/examples/ASTraitCollection/Sample/main.m deleted file mode 100644 index ae9488711c..0000000000 --- a/examples/ASTraitCollection/Sample/main.m +++ /dev/null @@ -1,20 +0,0 @@ -/* This file provided by Facebook is for non-commercial testing and evaluation - * purposes only. Facebook reserves all rights not expressly granted. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL - * FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN - * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN - * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - */ - -#import - -#import "AppDelegate.h" - -int main(int argc, char * argv[]) { - @autoreleasepool { - return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); - } -} diff --git a/examples_extra/ASTraitCollection/Podfile b/examples_extra/ASTraitCollection/Podfile index 6c012e3c04..919de4b311 100644 --- a/examples_extra/ASTraitCollection/Podfile +++ b/examples_extra/ASTraitCollection/Podfile @@ -1,3 +1,5 @@ source 'https://github.com/CocoaPods/Specs.git' -platform :ios, '8.0' -pod 'AsyncDisplayKit', :path => '../..' +platform :ios, '7.0' +target 'Sample' do + pod 'AsyncDisplayKit', :path => '../..' +end diff --git a/examples_extra/ASTraitCollection/Sample.xcodeproj/project.pbxproj b/examples_extra/ASTraitCollection/Sample.xcodeproj/project.pbxproj index b46865ed75..f9e679bb36 100644 --- a/examples_extra/ASTraitCollection/Sample.xcodeproj/project.pbxproj +++ b/examples_extra/ASTraitCollection/Sample.xcodeproj/project.pbxproj @@ -10,7 +10,7 @@ 05E2128719D4DB510098F589 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 05E2128619D4DB510098F589 /* main.m */; }; 05E2128A19D4DB510098F589 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 05E2128919D4DB510098F589 /* AppDelegate.m */; }; 05E2128D19D4DB510098F589 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 05E2128C19D4DB510098F589 /* ViewController.m */; }; - 3EC0CDCBA10D483D9F386E5E /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3D24B17D1E4A4E7A9566C5E9 /* libPods.a */; }; + 1BEECAB53F4B61DCB949ED44 /* libPods-Sample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 1EEDFC574739077BA65E0CF5 /* libPods-Sample.a */; }; 9C37D01E1CC94BC9004C8BC1 /* Launch Screen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9C37D01D1CC94BC9004C8BC1 /* Launch Screen.storyboard */; }; 9CACC7811CCEAF9E009A1613 /* TableViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CACC7801CCEAF9E009A1613 /* TableViewController.m */; }; 9CACC7841CCEAFAE009A1613 /* CollectionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 9CACC7831CCEAFAE009A1613 /* CollectionViewController.m */; }; @@ -19,6 +19,7 @@ /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 056298286C03B7760575CC56 /* Pods-Sample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Sample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Sample/Pods-Sample.debug.xcconfig"; sourceTree = ""; }; 05E2128119D4DB510098F589 /* Sample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Sample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 05E2128519D4DB510098F589 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 05E2128619D4DB510098F589 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; @@ -27,6 +28,7 @@ 05E2128B19D4DB510098F589 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 05E2128C19D4DB510098F589 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 088AA6578212BE9BFBB07B70 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; + 1EEDFC574739077BA65E0CF5 /* libPods-Sample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Sample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 3D24B17D1E4A4E7A9566C5E9 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; 9C37D01D1CC94BC9004C8BC1 /* Launch Screen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = "Launch Screen.storyboard"; sourceTree = ""; }; 9CACC77F1CCEAF9E009A1613 /* TableViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TableViewController.h; sourceTree = ""; }; @@ -37,6 +39,7 @@ 9CACC7861CCEBD3B009A1613 /* KittenNode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KittenNode.m; sourceTree = ""; }; 9CACC7881CCEC82C009A1613 /* OverrideViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OverrideViewController.h; sourceTree = ""; }; 9CACC7891CCEC82C009A1613 /* OverrideViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OverrideViewController.m; sourceTree = ""; }; + A7F0013FBBCBEA0C9FB68986 /* Pods-Sample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Sample.release.xcconfig"; path = "Pods/Target Support Files/Pods-Sample/Pods-Sample.release.xcconfig"; sourceTree = ""; }; C068F1D3F0CC317E895FCDAB /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -45,7 +48,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 3EC0CDCBA10D483D9F386E5E /* libPods.a in Frameworks */, + 1BEECAB53F4B61DCB949ED44 /* libPods-Sample.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -107,6 +110,7 @@ isa = PBXGroup; children = ( 3D24B17D1E4A4E7A9566C5E9 /* libPods.a */, + 1EEDFC574739077BA65E0CF5 /* libPods-Sample.a */, ); name = Frameworks; sourceTree = ""; @@ -116,6 +120,8 @@ children = ( C068F1D3F0CC317E895FCDAB /* Pods.debug.xcconfig */, 088AA6578212BE9BFBB07B70 /* Pods.release.xcconfig */, + 056298286C03B7760575CC56 /* Pods-Sample.debug.xcconfig */, + A7F0013FBBCBEA0C9FB68986 /* Pods-Sample.release.xcconfig */, ); name = Pods; sourceTree = ""; @@ -127,12 +133,12 @@ isa = PBXNativeTarget; buildConfigurationList = 05E212A419D4DB510098F589 /* Build configuration list for PBXNativeTarget "Sample" */; buildPhases = ( - E080B80F89C34A25B3488E26 /* Check Pods Manifest.lock */, + E080B80F89C34A25B3488E26 /* 📦 Check Pods Manifest.lock */, 05E2127D19D4DB510098F589 /* Sources */, 05E2127E19D4DB510098F589 /* Frameworks */, 05E2127F19D4DB510098F589 /* Resources */, - F012A6F39E0149F18F564F50 /* Copy Pods Resources */, - FFF65E837E66ADA71296F0FF /* Embed Pods Frameworks */, + F012A6F39E0149F18F564F50 /* 📦 Copy Pods Resources */, + FFF65E837E66ADA71296F0FF /* 📦 Embed Pods Frameworks */, ); buildRules = ( ); @@ -187,14 +193,14 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - E080B80F89C34A25B3488E26 /* Check Pods Manifest.lock */ = { + E080B80F89C34A25B3488E26 /* 📦 Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Check Pods Manifest.lock"; + name = "📦 Check Pods Manifest.lock"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; @@ -202,34 +208,34 @@ shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; showEnvVarsInLog = 0; }; - F012A6F39E0149F18F564F50 /* Copy Pods Resources */ = { + F012A6F39E0149F18F564F50 /* 📦 Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Copy Pods Resources"; + name = "📦 Copy Pods Resources"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Sample/Pods-Sample-resources.sh\"\n"; showEnvVarsInLog = 0; }; - FFF65E837E66ADA71296F0FF /* Embed Pods Frameworks */ = { + FFF65E837E66ADA71296F0FF /* 📦 Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); - name = "Embed Pods Frameworks"; + name = "📦 Embed Pods Frameworks"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-frameworks.sh\"\n"; + shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods-Sample/Pods-Sample-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; /* End PBXShellScriptBuildPhase section */ @@ -330,7 +336,7 @@ }; 05E212A519D4DB510098F589 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = C068F1D3F0CC317E895FCDAB /* Pods.debug.xcconfig */; + baseConfigurationReference = 056298286C03B7760575CC56 /* Pods-Sample.debug.xcconfig */; buildSettings = { INFOPLIST_FILE = Sample/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; @@ -342,7 +348,7 @@ }; 05E212A619D4DB510098F589 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 088AA6578212BE9BFBB07B70 /* Pods.release.xcconfig */; + baseConfigurationReference = A7F0013FBBCBEA0C9FB68986 /* Pods-Sample.release.xcconfig */; buildSettings = { INFOPLIST_FILE = Sample/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 9.0; diff --git a/examples_extra/ASTraitCollection/Sample/KittenNode.m b/examples_extra/ASTraitCollection/Sample/KittenNode.m index 98771a8cb8..18babcdc36 100644 --- a/examples_extra/ASTraitCollection/Sample/KittenNode.m +++ b/examples_extra/ASTraitCollection/Sample/KittenNode.m @@ -130,13 +130,11 @@ static const CGFloat kInnerPadding = 10.0f; - (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize { - ASTraitCollection *traitCollection = [self asyncTraitCollection]; - ASStackLayoutSpec *stackSpec = [[ASStackLayoutSpec alloc] init]; stackSpec.spacing = kInnerPadding; - stackSpec.children = @[_imageNode, _textNode]; + [stackSpec setChildren:@[_imageNode, _textNode]]; - if (traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) { + if (self.asyncTraitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) { _imageNode.alignSelf = ASStackLayoutAlignSelfStart; stackSpec.direction = ASStackLayoutDirectionHorizontal; } else {