Как я могу правильно добавить узлы в ASCellNode с помощью текстуры - PullRequest
0 голосов
/ 25 июня 2019

Я учусь AsyncDisplayKit / Texture .Я пытаюсь создать ASTableNode с пользовательской ячейкой.

Я пытаюсь понять, как правильно установить и закрепить узлы, которые я создаю в моем ExampleNode.

Я пыталсяthis

   override func layoutSpecThatFits(_ constrainedSize: ASSizeRange) -> ASLayoutSpec {

        let stack = ASStackLayoutSpec.vertical()
        stack.children = textNode
        return stack
    }

Но есть ошибка

Невозможно присвоить значение типа 'ASTextNode' для типа '[ASLayoutElement]?'

I тогдаобновлено layoutSpecThatFits с

override func layoutSpecThatFits(_ constrainedSize: ASSizeRange) -> ASLayoutSpec {
  return ASStackLayoutSpec(
        direction: .horizontal,
        spacing: 16,
        justifyContent: .start,
        alignItems: .center,
        children: [textNode]
    )
}

Но это увеличило текст прямо до левой части ячейки.Интервал вообще не применяется.

enter image description here

Я изо всех сил пытаюсь найти достойное руководство по использованию этого, поэтому, пожалуйста, простите меня, если ответ очевиден.

Как правильно, используя приведенный ниже класс, добавить узлы в ячейку?

import AsyncDisplayKit

final class FeedNodeController: ASViewController<ASDisplayNode> {

    var tableNode: ASTableNode {
        return node as! ASTableNode
    }

    private lazy var tableNodeProvider = FeedTableNodeProvider()

    init() {
        super.init(node: ASTableNode())
        tableNode.delegate = tableNodeProvider
        tableNode.dataSource = tableNodeProvider

        tableNode.view.tableFooterView = UIView()
    }

    required init?(coder aDecoder: NSCoder) {
        return nil
    }
}

class FeedTableNodeProvider: NSObject {
    private let feed = ["Foo", "Bar", "Boo", "Baz"]
}

extension FeedTableNodeProvider: ASTableDataSource, ASTableDelegate {

    func numberOfSections(in tableNode: ASTableNode) -> Int {
        return 1
    }
    func tableNode(_ tableNode: ASTableNode, nodeBlockForRowAt indexPath: IndexPath) -> ASCellNodeBlock {

        let node = { [unowned self] () -> ASCellNode in
            return ExampleNode(text: self.feed[indexPath.row])
        }

        return node
    }

    func tableNode(_ tableNode: ASTableNode, numberOfRowsInSection section: Int) -> Int {
        return feed.count
    }
}

class ExampleNode: ASCellNode {

    private lazy var textNode: ASTextNode = {
        let node = ASTextNode()
        node.backgroundColor = .blue
        return node
    }()

    init(text: String) {
        super.init()
        textNode.attributedText = NSAttributedString(string: text)
        backgroundColor = .purple
        addSubnode(textNode)
    }

    override func layoutSpecThatFits(_ constrainedSize: ASSizeRange) -> ASLayoutSpec {
        return ASStackLayoutSpec(
            direction: .horizontal,
            spacing: 16,
            justifyContent: .start,
            alignItems: .center,
            children: [textNode]
        )
    }
}

1 Ответ

0 голосов
/ 20 июля 2019

ASTexNode вычислит его width только для длины текста, если вы не установите для него ширину

не очень понимаю, что вы спрашиваете

Если вы хотите добавить padding, вы можете обернуть текущую ASStackLayoutSpec с помощью ASInsetLayoutSpec

...
let mainStack = ASStackLayoutSpec(
            direction: .horizontal,
            spacing: 16,
            justifyContent: .start,
            alignItems: .center,
            children: [textNode])

let paddedMainStack = ASInsetLayoutSpec(insets: UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16), child: mainStack)

return paddedMainStack
...

тогда у вас будет padding

Счастливое текстурирование

...