2016-03-29 7 views
0

ここでは、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 
    } 
} 

答えて

1

ContentNodeクラス内では、各テキストノードでmeasure()を呼び出す必要があります。 attributedStringプロパティが設定された後はいつでも行うことができます。 ContentNodeをインスタンス化しているクラスでは、インスタンスでmeasureを呼び出す必要があります。私は最後の部分で100%確実ではない。インスタンスの.viewまたは.layerプロパティにアクセスすると、暗黙的に呼び出されることがあります。

私が見たlayoutSpecThatFitsの例には、通常、ASTableViewまたはASCollectionViewが含まれています。そして、その2つの容器はあなたのためにmeasure()を呼びます。

+0

親の宣言からサブクラスのメジャーを呼び出すことがトリックでした、ありがとう! – Kevin

1

このノードをどのようにホスト/作成していますか?詳細については、NSSpainのトーク(https://www.youtube.com/watch?v=RY_X7l1g79Q)を参照してください。最後のどこかで、テーブル、コレクション、ビューコントローラについて説明します。

ノードをASTableNode、ASCollectionNode、ASPagerNode、またはASViewControllerに配置すると、ノードを自動的に、非同期的に測定することができます。自分でノードをホストする必要があるのはまれなケースですが、これを行う必要がある場合は、私にmeasureメソッドを呼び出す必要があります。

関連する問題