ここでは、ASDisplayNodeの単純なサブクラスがあり、その内容はちょうど2つのASTextNodeが重ねられています。セカンダリ文字列が存在しない場合は、ASDisplayNodeの中央に配置された単一のASTextNodeが必要です。layoutSpecThatFitsは、ノードが子ノードに追加されたときには呼び出されません
手動でフレームを設定すると要素をレイアウトできますが、レイアウトスタックを使用してレイアウトをレイアウトしたい自動的に。
layoutSpecThatFitsがまったく呼び出されていません。 init内でmeasureをselfで呼び出すと、強制的に呼び出すことができますが、結果の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
}
}
親の宣言からサブクラスのメジャーを呼び出すことがトリックでした、ありがとう! – Kevin