Как разместить родительский элемент ASDisplayNode в AsyncDisplayKit?
Я хочу сделать как на этой картинке:
я делаю templateDisplayNode:
@interface TemplateDisplayNode : ASDisplayNode
@property (nonatomic, strong) ASDisplayNode *headerNode;
@property (nonatomic, strong) ASDisplayNode *ContentNode;
- (void)addContentNode:(ASDisplayNode *)contentNode;
@end
@implement TemplateDisplayNode
- (instancetype)init
{
self = [super init];
if (self) {
[self createSubviews];
}
return self;
}
- (void)createSubviews {
[self createHeaderNode];
[self createContentNode];
}
- (void)addContentNode:(ASDisplayNode *)contentNode {
[self.contentNode addSubnode:contentNode];
}
- (void)createHeaderNode {
self.headerNode = [[ASDisplayNode alloc] init];
self.headerNode.backgroundColor = [UIColor blueColor];
[self addSubnode:self.headerNode];
}
- (void)createContentNode {
self.contentNode = [[ASDisplayNode alloc] init];
self.contentNode.style.flexGrow = YES;
[self addSubnode:self.contentNode];
}
- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize {
CGFloat mainScreenWidth = [UIScreen mainScreen].bounds.size.width;
NSMutableArray *mainStackContent = [[NSMutableArray alloc] init];
if (self.headerNode) {
self.headerNode.style.preferredSize = CGSizeMake(mainScreenWidth, 48);
[mainStackContent addObject:self.headerNode];
}
if (self.contentNode) {
[mainStackContent addObject:self.contentNode];
}
ASStackLayoutSpec *contentSpec =
[ASStackLayoutSpec
stackLayoutSpecWithDirection:ASStackLayoutDirectionVertical
spacing:0
justifyContent:ASStackLayoutJustifyContentStart
alignItems:ASStackLayoutAlignItemsStretch
children:mainStackContent];
return contentSpec;
}
@end
и создайте страницу класса TemplateDisplayNode:
@interface Page1Node : TemplateDisplayNode
@end
@implement Page1Node
- (ASLayoutSpec *)layoutSpecThatFits:(ASSizeRange)constrainedSize {
[super layoutSpecThatFits:constrainedSize];
}
@end
И используйте его в ASViewController:
@interface MyViewController : ASViewController
@property (nonatomic, strong) MyCustomASViewControllerWithTableNode *myTableNodeViewController;
@property (nonatomic, strong) Page1Node *page1node;
@end
@implement MyViewController
- (instancetype)init {
self.page1node = [[Page1Node alloc] init];
self = [super initWithNode:self.page1node];
if (self) {
[self createMyTableNodeViewController];
}
return self;
}
- (void)createMyTableNodeViewController {
self.myTableNodeViewController = [[MyCustomASViewControllerWithTableNode alloc] init];
[self.page1node addContentNode:self.myTableNodeViewController.node]; //add TableNode like content on page1node
[self addChildViewController:self.myTableNodeViewController];
[self.myTableNodeViewController didMoveToParentViewController:self];
}
@end
MyCustomASViewControllerWithTableNode:
@interface MyCustomASViewControllerWithTableNode : ASViewController
@property (nonatomic, strong) ASTableNode *tableNode;
@end
...
- (instancetype)init {
_tableNode = [[ASTableNode alloc] initWithStyle:UITableViewStylePlain];
self = [super initWithNode:_tableNode];
if (self) {
_tableNode.dataSource = self;
_tableNode.delegate = self;
}
return self;
}
и когда я запускаю его, я вижу таблицу в поле содержимого, но не могу прокрутить таблицу, потому что Size frame ContentNode = {0; 0}; Как правильно сделать макет, чтобы установить размер? Если я делаю то же самое, но без использования TemplateDisplayNode, то все работает. Я хотел бы использовать TemplateDisplayNode для удаления большого количества дублирующегося кода для похожих страниц. Документацию AsyncDisplayKit не рекомендуется использовать:
[super layoutSpecThatFits:constrainedSize];
Если я удаляю эту строку, то я не захожу в layoutSpecThatFits в TemplateDisplayNode. Посоветуйте как быть? Какие могут быть решения?