0

这是一个简单的 ASDisplayNode 子类,其内容只是 2 个相互堆叠的 ASTextNode。如果辅助字符串不存在,我只希望在 ASDisplayNode 中有一个居中的 ASTextNode

如果我手动设置框架,我可以很好地布局元素,但我想使用布局堆栈来自动布局。

layoutSpecThatFits 根本没有被调用。如果我在 init 中对 self 调用 measure,我可以强制调用它,但是生成的 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
    }
}
4

2 回答 2

1

您如何托管/创建此节点?查看 NSSpain 演讲了解详细信息 ( https://www.youtube.com/watch?v=RY_X7l1g79Q ),在接近尾声的某处讨论了表、集合、视图控制器。

您可以将节点放在 ASTableNode、ASCollectionNode、ASPagerNode 或 ASViewController 中,以自动和异步测量它们。需要自己托管节点应该是一种罕见的情况,但如果您确实需要这样做,那么有必要调用我的测量方法。

于 2016-04-10T02:51:45.863 回答
1

在 ContentNode 类中,您需要在每个文本节点上调用 measure()。设置属性字符串属性后,您可以随时执行此操作。然后在实例化 ContentNode 的类中,您可能需要在实例上调用 measure。我对最后一部分不是 100% 确定的。当您访问实例的 .view 或 .layer 属性时,它可能会被隐式调用。

我见过的layoutSpecThatFits的例子通常涉及到ASTableView或者ASCollectionView。这两个容器负责为您调用 measure() 。

于 2016-04-08T00:10:58.250 回答