layoutSpecThatFits не вызывается, когда узел добавляется к дочернему узлу

Вот простой подкласс ASDisplayNode, содержимое которого состоит всего из двух ASTextNode, расположенных друг над другом. Если вторичная строка отсутствует, я хочу только один центрированный ASTextNode в ASDisplayNode

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

layoutSpecThatFits не вызывается вообще. Я могу заставить его вызываться, если я вызываю measure on self в init, но фрейм результирующего primaryTextNode равен 0,0,0,0... почему иначе не вызывается layoutSpecThatFits? Если я вызываю measure только с установленной первичной строкой, я также не уверен, почему это нулевой прямоугольник для ASTextNode после вызова спецификации макета.

class ContentNode : ASDisplayNode {

    var primaryAttributedString : NSAttributedString {
        didSet {
            primaryTextNode.attributedString = primaryAttributedString
        }
    }

    private lazy var primaryTextNode : ASTextNode = {
        let node = ASTextNode()
        node.attributedString = self.primaryAttributedString
        node.maximumNumberOfLines = 1;
        node.flexGrow = true
        //        node.frame = I need to manually set here, layout spec that fits not called
        self.addSubnode(node)
        return node
    }()

    var secondaryAttributedString : NSAttributedString? {
        didSet {
            if secondaryAttributedString != nil {
                secondaryTextNode.attributedString = secondaryAttributedString
            }
        }
    }

    private lazy var secondaryTextNode : ASTextNode = {
        let node = ASTextNode()
        node.attributedString = self.secondaryAttributedString
        node.maximumNumberOfLines = 1;
        //        node.frame = need to manually set here, layout spec that fits not called

        self.addSubnode(node)
        return node
    }()

    init(frame: CGRect, primaryText : NSAttributedString, secondaryText : NSAttributedString?) {
        self.primaryAttributedString = primaryText
        self.secondaryAttributedString = secondaryText
        super.init()
        self.frame = frame
        //        self.measure(frame.size)
        backgroundColor = UIColor.clearColor()
    }

    // THIS NEVER GETS CALLED (unless i do a self.measure call in init, and even then it does not layout the text node properly even with just the primary text node)
    override func layoutSpecThatFits(constrainedSize: ASSizeRange) -> ASLayoutSpec {
        var mainStackContent = [ASLayoutable]()
        mainStackContent.append(self.primaryTextNode)
        if nil != secondaryAttributedString {
            mainStackContent.append(secondaryTextNode)
        }
        let contentSpec = ASStackLayoutSpec(direction: .Vertical, spacing: 2, justifyContent: .Center, alignItems: .Center, children: mainStackContent)

        return contentSpec
    }
}

2 ответа

Решение

Внутри вашего класса ContentNode вам нужно будет вызвать measure() для каждого из текстовых узлов. Вы можете сделать это в любое время после того, как установлено свойство attributetedString. Затем в классе, который создает экземпляр ContentNode, вам может потребоваться вызвать measure для экземпляра. Я не уверен на 100% в последней части. Он может неявно вызываться при доступе к свойству.view или.layer вашего экземпляра.

Примеры для layoutSpecThatFits, которые я видел, обычно включают ASTableView или ASCollectionView. И эти два контейнера позаботятся о вызове measure() для вас.

Как вы хостинг / создание этого узла? За подробностями обращайтесь к разговору о NSSpain ( https://www.youtube.com/watch?v=RY_X7l1g79Q), где-то ближе к концу обсуждаются таблицы, коллекции, контроллеры представления.

Вы можете поместить узел в ASTableNode, ASCollectionNode, ASPagerNode или ASViewController, чтобы они автоматически и асинхронно измерялись. Это должно быть редким случаем, когда вам нужно разместить узел самостоятельно, но если вам нужно сделать это, то необходимо вызвать меня метод измерения.

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