From eeb49859f09500d8c7d3ab73306f49827a38b41b Mon Sep 17 00:00:00 2001 From: Luke Parham Date: Wed, 9 Dec 2015 13:13:39 -0600 Subject: [PATCH] view controller node is resized to match layoutspec for cells --- AsyncDisplayKit/ASCellNode.h | 9 ++++ AsyncDisplayKit/ASCellNode.m | 53 +++++++++++++++++-- AsyncDisplayKit/ASDisplayNode.h | 4 -- AsyncDisplayKit/ASDisplayNode.mm | 19 ------- .../Sample/ViewController.m | 10 +++- 5 files changed, 67 insertions(+), 28 deletions(-) diff --git a/AsyncDisplayKit/ASCellNode.h b/AsyncDisplayKit/ASCellNode.h index 78821ef2d8..e8cb3e57a5 100644 --- a/AsyncDisplayKit/ASCellNode.h +++ b/AsyncDisplayKit/ASCellNode.h @@ -93,6 +93,15 @@ typedef NSUInteger ASCellNodeAnimation; */ - (void)setNeedsLayout; + + +/* TODO: WRITE DOCUMENTATION */ + +- (instancetype)initWithViewControllerBlock:(ASDisplayNodeViewControllerBlock)viewControllerBlock; +- (instancetype)initWithViewControllerBlock:(ASDisplayNodeViewControllerBlock)viewControllerBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock; + + + @end diff --git a/AsyncDisplayKit/ASCellNode.m b/AsyncDisplayKit/ASCellNode.m index f4edd1dd94..211b127bf8 100644 --- a/AsyncDisplayKit/ASCellNode.m +++ b/AsyncDisplayKit/ASCellNode.m @@ -18,6 +18,13 @@ #pragma mark - #pragma mark ASCellNode +@interface ASCellNode (){ +ASDisplayNodeDidLoadBlock _nodeLoadedBlock; +ASDisplayNode *_viewControllerNode; +UIViewController *_viewController; +} +@end + @implementation ASCellNode - (instancetype)init @@ -32,6 +39,35 @@ return self; } +- (instancetype)initWithViewControllerBlock:(ASDisplayNodeViewControllerBlock)viewControllerBlock +{ + return [self initWithViewControllerBlock:viewControllerBlock didLoadBlock:nil]; +} + +- (instancetype)initWithViewControllerBlock:(ASDisplayNodeViewControllerBlock)viewControllerBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock +{ + if (!(self = [super init])) + return nil; + + ASDisplayNodeAssertNotNil(viewControllerBlock, @"should initialize with a valid block that returns a UIViewController"); + + _viewController = viewControllerBlock(); + _viewControllerNode = [[ASDisplayNode alloc] initWithViewBlock:^UIView *{ + return _viewController.view; + } didLoadBlock:didLoadBlock]; + + [self addSubnode:_viewControllerNode]; + + _nodeLoadedBlock = didLoadBlock; //not sure where i should plug in to call this... + return self; +} + +- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize { + _viewControllerNode.frame = (CGRect){{0,0}, constrainedSize.max}; + + return [super layoutSpecThatFits:constrainedSize]; +} + - (instancetype)initWithLayerBlock:(ASDisplayNodeLayerBlock)viewBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock { ASDisplayNodeAssertNotSupported(); @@ -40,9 +76,8 @@ - (instancetype)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock { - return [super initWithViewBlock:viewBlock didLoadBlock:didLoadBlock]; -// ASDisplayNodeAssertNotSupported(); -// return nil; + ASDisplayNodeAssertNotSupported(); + return nil; } - (void)setLayerBacked:(BOOL)layerBacked @@ -70,6 +105,9 @@ ASDisplayNodeAssertMainThread(); ASDisplayNodeAssert([self.view isKindOfClass:_ASDisplayView.class], @"ASCellNode views must be of type _ASDisplayView"); [(_ASDisplayView *)self.view __forwardTouchesBegan:touches withEvent:event]; +// if (_viewController) { +// [_viewController touchesBegan:touches withEvent:event]; +// } } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event @@ -77,6 +115,9 @@ ASDisplayNodeAssertMainThread(); ASDisplayNodeAssert([self.view isKindOfClass:_ASDisplayView.class], @"ASCellNode views must be of type _ASDisplayView"); [(_ASDisplayView *)self.view __forwardTouchesMoved:touches withEvent:event]; +// if (_viewController) { +// [_viewController touchesMoved:touches withEvent:event]; +// } } - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event @@ -84,6 +125,9 @@ ASDisplayNodeAssertMainThread(); ASDisplayNodeAssert([self.view isKindOfClass:_ASDisplayView.class], @"ASCellNode views must be of type _ASDisplayView"); [(_ASDisplayView *)self.view __forwardTouchesEnded:touches withEvent:event]; +// if (_viewController) { +// [_viewController touchesEnded:touches withEvent:event]; +// } } - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event @@ -91,6 +135,9 @@ ASDisplayNodeAssertMainThread(); ASDisplayNodeAssert([self.view isKindOfClass:_ASDisplayView.class], @"ASCellNode views must be of type _ASDisplayView"); [(_ASDisplayView *)self.view __forwardTouchesCancelled:touches withEvent:event]; +// if (_viewController) { +// [_viewController touchesCancelled:touches withEvent:event]; +// } } @end diff --git a/AsyncDisplayKit/ASDisplayNode.h b/AsyncDisplayKit/ASDisplayNode.h index d0b578b262..922684cae0 100644 --- a/AsyncDisplayKit/ASDisplayNode.h +++ b/AsyncDisplayKit/ASDisplayNode.h @@ -98,10 +98,6 @@ typedef NS_OPTIONS(NSUInteger, ASInterfaceState) */ - (id)init; - -- (id)initWithViewControllerBlock:(ASDisplayNodeViewControllerBlock)viewControllerBlock; -- (id)initWithViewControllerBlock:(ASDisplayNodeViewControllerBlock)viewControllerBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock; - /** * @abstract Alternative initializer with a block to create the backing view. * diff --git a/AsyncDisplayKit/ASDisplayNode.mm b/AsyncDisplayKit/ASDisplayNode.mm index 91c57ee052..6e6928d98b 100644 --- a/AsyncDisplayKit/ASDisplayNode.mm +++ b/AsyncDisplayKit/ASDisplayNode.mm @@ -251,25 +251,6 @@ static ASDisplayNodeMethodOverrides GetASDisplayNodeMethodOverrides(Class c) return self; } -- (id)initWithViewControllerBlock:(ASDisplayNodeViewControllerBlock)viewControllerBlock -{ - return [self initWithViewControllerBlock:viewControllerBlock didLoadBlock:nil]; -} - -- (id)initWithViewControllerBlock:(ASDisplayNodeViewControllerBlock)viewControllerBlock didLoadBlock:(ASDisplayNodeDidLoadBlock)didLoadBlock -{ - if (!(self = [super init])) - return nil; - - ASDisplayNodeAssertNotNil(viewControllerBlock, @"should initialize with a valid block that returns a UIViewController"); - - return [self initWithViewBlock:^UIView *{ - UIViewController *vc = viewControllerBlock(); - vc.view.clipsToBounds = YES; // not sure this is the way to go, doesn't really make it better per se - return vc.view; - } didLoadBlock:didLoadBlock]; -} - - (id)initWithViewBlock:(ASDisplayNodeViewBlock)viewBlock { return [self initWithViewBlock:viewBlock didLoadBlock:nil]; diff --git a/examples/CollectionViewWithViewControllerCells/Sample/ViewController.m b/examples/CollectionViewWithViewControllerCells/Sample/ViewController.m index b28fd7b652..f8bb7a9044 100644 --- a/examples/CollectionViewWithViewControllerCells/Sample/ViewController.m +++ b/examples/CollectionViewWithViewControllerCells/Sample/ViewController.m @@ -14,7 +14,7 @@ #import #import "MosaicCollectionViewLayout.h" #import "SupplementaryNode.h" -#import "ImageCellNode.h" +#import "ImageViewController.h" static NSUInteger kNumberOfImages = 14; @@ -92,7 +92,13 @@ static NSUInteger kNumberOfImages = 14; - (ASCellNode *)collectionView:(ASCollectionView *)collectionView nodeForItemAtIndexPath:(NSIndexPath *)indexPath { - return [[ImageCellNode alloc] initWithImage:_sections[indexPath.section][indexPath.item]]; + ASCellNode *node = [[ASCellNode alloc] initWithViewControllerBlock:^UIViewController *{ + return [[ImageViewController alloc] initWithImage:_sections[indexPath.section][indexPath.item]]; + }]; + + return node; + + //[[ImageCellNode alloc] initWithImage:_sections[indexPath.section][indexPath.item]]; } - (ASCellNode *)collectionView:(ASCollectionView *)collectionView nodeForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath