2016-04-15 44 views
1

到目前爲止,我使用AsyncDisplayKit完成了很多工作,我真的很滿意它。不幸的是,現在我碰到了一個路障。如何爲ASDisplayNode強制執行最小高度?

我無法獲得一個ASButtonNode有一個最小高度(如果這是重要的ASCellNode)。

class SmallButtonCellNode: ASCellNode { 

    let normalSmallButton = ASButtonNode() 
    let selectedSmallButton = ASButtonNode() 

    init() { 
    super.init()  
    self.backgroundColor = UIColor.lightGrayColor() 

    // .. button title and background configuration here .. 

     let buttonSizeRange = 
     ASRelativeSizeRangeMake(
     ASRelativeSizeMake(
      ASRelativeDimensionMakeWithPercent(0), 
      ASRelativeDimensionMakeWithPoints(35.0) 
     ), 
     ASRelativeSizeMake(
      ASRelativeDimensionMakeWithPercent(1), 
      ASRelativeDimensionMakeWithPoints(35.0) 
     ) 
    ); 

     self.normalSmallButton.preferredFrameSize = CGSize(width: 111.0, height: 35.0) 
     self.normalSmallButton.flexGrow = true 
     self.normalSmallButton.sizeRange = buttonSizeRange 
     self.addSubnode(self.normalSmallButton) 

     self.selectedSmallButton.preferredFrameSize = CGSize(width: 111.0, height: 35.0) 
     self.selectedSmallButton.flexGrow = true 
     self.selectedSmallButton.sizeRange = buttonSizeRange 
     self.addSubnode(self.selectedSmallButton) 
    } 

    // MARK: - Layout 

    override func layoutSpecThatFits(constrainedSize: ASSizeRange) -> ASLayoutSpec { 
    let spec = 
     ASStackLayoutSpec(
     direction: .Horizontal, 
     spacing: 20.0, 
     justifyContent: .SpaceAround, 
     alignItems: .Center, 
     children: [self.normalSmallButton, self.selectedSmallButton] 
    ) 

    return 
     ASInsetLayoutSpec(
     insets: UIEdgeInsets(top: 20.0, left: 20.0, bottom: 20.0, right: 20.0), 
     child: spec 
    ) 
    } 
} 

結果是(雖然constrainedSize具有高度最大爲100.0):

The ASButtonNodes are only fitting the text height

的ASButtonNodes僅擬合文本高度。

我試着:

  • 除去優選的幀大小(無效果)從.Center.Stretch
  • 改變(按鈕是作爲細胞一樣高 - 插圖)
  • flexGrow =真在不同的地方

我知道我可以使用.Stretch將單元格高度從100更改爲75,然後按鈕將自動結束b eing 35分高的,但是這不是我想要的(因爲這樣的佈局邏輯「的按鈕是35分高」實際上是集合視圖委託的部分..)

請幫助:)

回答

0

更新回答:

剛剛去了asyncdisplaykit.org並看到了對ASStaticLayoutSpec的引用。它應該解決你的問題。在layoutSpecThatFits()...

spec.sizeRange = normalSmallButton.sizeRange let staticSpec1 = ASStaticLayoutSpec(children: [spec]) return staticSpec1

....

如果您的電池是很簡單的,我認爲它會更容易,更直接的只是衡量calculateSizeThatFits你的子節點(constrainedSize:CGSize)。然後在layout()中,計算每個子節點的.frame。

如果你想使用佈局規範,我的黑客應該是在init()的子節點上調用.measure()。然後在layoutSpecsThatFit中,您可以將插入值調整爲節點的calculatedSize與最小大小之間的差異。祝你好運。

var diffY: CGFloat = (35.0 - selectedSmallButton.calculatedSize.height)/2

if diffY < 0 { diffY = 0 }

return ASInsetLayoutSpec( insets: UIEdgeInsets(top: diffY, left: 20.0, bottom: diffY, right: 20.0), child: spec)

+0

裁判到'ASStaticLayoutSpec'是正確的指針。我不知道靜態佈局規範會這樣做,b/c文檔只會說「將佈局規格定位在固定位置的佈局規範」。 - 沒有任何關於體型的信息,唯一的孩子自動佔據了整個空間,沒有任何位置說明。 不過,這裏是我的解決方案:https://gist.github。com/floriankrueger/3d7932f253e1ec1d8bbc0e5b293a24dd THANK YOU – floriankrueger

+0

btw'ASStaticLayoutSpec'現在是'ASAbsoluteLayoutSpec' - http://texturegroup.org/docs/layout2-conversion-guide.html – yash

0

嘗試yourStackStyle.minHeight = ASDimensionMake(yourMinHeight)