将节点添加到子节点时不会调用 layoutSpecThatFits
layoutSpecThatFits is not called when a node is added to child node
这是 ASDisplayNode 的一个简单子类,其内容只是 2 个 ASTextNode 相互堆叠。如果辅助字符串不存在,我只想在 ASDisplayNode
中有一个居中的 ASTextNode
如果我手动设置框架,我可以很好地布局元素,但我想使用布局堆栈自动布局。
layoutSpecThatFits 根本没有被调用。如果我在 init 中对 self 调用 measure,我可以强制调用它,但是生成的 primaryTextNode 的框架是 0,0,0,0 ...为什么根本不调用 layoutSpecThatFits?如果我仅使用主字符串集调用测量,我也不确定为什么在调用布局规范后它是 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
}
}
在您的 ContentNode class 中,您需要在每个文本节点上调用 measure()。在设置 attributedString 属性 后,您可以随时执行此操作。那么在实例化ContentNode的class中,可能需要调用实例上的measure。我对最后一部分不是 100% 确定。当您访问实例的 .view 或 .layer 属性 时,它可能会被隐式调用。
我看到的layoutSpecThatFits的例子一般都会涉及到ASTableView或者ASCollectionView。这两个容器负责为您调用 measure()。
您如何托管/创建此节点?查看 NSSpain 讨论以获取详细信息 (https://www.youtube.com/watch?v=RY_X7l1g79Q),接近尾声的地方讨论了表、集合、视图控制器。
您可以将节点放入 ASTableNode、ASCollectionNode、ASPagerNode 或 ASViewController 中,以自动异步测量它们。需要自己托管一个节点应该是很少见的,但是如果你确实需要这样做那么有必要叫我measure方法。
这是 ASDisplayNode 的一个简单子类,其内容只是 2 个 ASTextNode 相互堆叠。如果辅助字符串不存在,我只想在 ASDisplayNode
中有一个居中的 ASTextNode如果我手动设置框架,我可以很好地布局元素,但我想使用布局堆栈自动布局。
layoutSpecThatFits 根本没有被调用。如果我在 init 中对 self 调用 measure,我可以强制调用它,但是生成的 primaryTextNode 的框架是 0,0,0,0 ...为什么根本不调用 layoutSpecThatFits?如果我仅使用主字符串集调用测量,我也不确定为什么在调用布局规范后它是 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
}
}
在您的 ContentNode class 中,您需要在每个文本节点上调用 measure()。在设置 attributedString 属性 后,您可以随时执行此操作。那么在实例化ContentNode的class中,可能需要调用实例上的measure。我对最后一部分不是 100% 确定。当您访问实例的 .view 或 .layer 属性 时,它可能会被隐式调用。
我看到的layoutSpecThatFits的例子一般都会涉及到ASTableView或者ASCollectionView。这两个容器负责为您调用 measure()。
您如何托管/创建此节点?查看 NSSpain 讨论以获取详细信息 (https://www.youtube.com/watch?v=RY_X7l1g79Q),接近尾声的地方讨论了表、集合、视图控制器。
您可以将节点放入 ASTableNode、ASCollectionNode、ASPagerNode 或 ASViewController 中,以自动异步测量它们。需要自己托管一个节点应该是很少见的,但是如果你确实需要这样做那么有必要叫我measure方法。