2016-06-27 87 views
1

我正在嘗試調整兩個垂直UIStackView s的大小,以便他們能夠以我想要的方式顯示內容。兩個垂直的UIStackViews位於另一個水平的UIStackView之內,它位於UITableViewCell之內。在每個垂直UIStackView中有三個UILabel。下面是當前視圖層次結構,我有:UILabels在嵌套的UIStackViews中被截斷?

View hierarchy

圖像視圖有其寬度和高度限制爲具有相同的比例。水平堆棧視圖的對齊方式爲.Center,分佈爲.Fill。垂直堆棧視圖1的對齊方式爲.Leading,分配爲.EqualSpacing。垂直堆棧視圖2的排列爲.Trailing,分佈爲.EqualSpacing。所有標籤都只有一條線路和內容堆棧視圖是可選的 - 我的text屬性設置爲nil,如果我沒有表現出tableView:cellForRowAtIndexPath:堆疊視圖東西。

我一直在試圖讓堆疊視圖標籤正確顯示文本而不截斷。將垂直堆棧視圖1中的文本截斷是可以的,但似乎堆棧視圖1喜歡調整其自身大小以佔據大部分寬度。即使是陌生人,這也不會一直髮生。 當垂直堆棧視圖1中的標籤非常短時,它似乎更經常發生。也似乎是垂直視圖2的大小,所以它只有最後一個標籤,這通常是三個標籤中最短的。

這裏就是我沒有成功嘗試:

  • 設置垂直堆疊視圖1具有高
  • 內容擁抱優先級設置垂直堆疊視圖擁有所需
  • 內容壓縮性優先
  • 子類UIStackView所以它返回一個帶有intrinsicContentSizewidth一樣大其標籤intrinsicContentSize.width
  • 遞歸設置在垂直堆疊視圖2中的佈置的子視圖有所需

任何幫助內容壓縮性的優先級,將不勝感激。

回答

0

我想通了。我子類UIStackView,而且除了覆蓋intrinsicContentSize,我也推翻layoutSubviews無效自身的內在內容的大小。

class NestedStackView: UIStackView { 
    override func intrinsicContentSize() -> CGSize { 
     var size = super.intrinsicContentSize() 

     for view in arrangedSubviews { 
      let viewSize = view.intrinsicContentSize() 

      if axis == .Vertical { 
       size.width = max(viewSize.width, size.width) 
      } else { 
       size.height = max(viewSize.height, size.height) 
      } 
     } 

     return size 
    } 

    override func layoutSubviews() { 
     invalidateIntrinsicContentSize() 
     super.layoutSubviews() 
    } 
}