Как разместить родительский элемент 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. Посоветуйте как быть? Какие могут быть решения?

0 ответов

Другие вопросы по тегам