2016-03-29 4 views
0

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

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

layoutSpecThatFits не вызывается вообще. Я могу заставить его вызываться, если я вызываю меру на себя в init, но кадр получающегося 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 
    } 
} 

ответ

1

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

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

+0

Вызов меры в подклассе из его родительской декларации был трюк, спасибо! – Kevin

1

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

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

Смежные вопросы