[英]Intrinsic content sized UICollectionView inside UITableView
首先,請允許我說,過去幾個月來我在Google和StackOverflow上花費了100個小時來試圖回答這個問題。 我已經閱讀了許多教程,但無法解決我的問題。 每個人都很失望,令人沮喪。
期望
現實
問題
我有一個包含UIView的UITableView。 UIView具有自動布局約束,可將其固定在單元格邊緣的15pt處,然后給它陰影和圓角。 在該UIView中,我有一些標簽,然后是UICollectionView和堆棧視圖。
我的UICollectionView的高度始終為0,我不知道如何使其具有固有尺寸。 我似乎可以使其正確顯示的唯一方法是,通過情節提要板中的自動布局將其強制設置為特定的高度(這就是我截取此屏幕截圖的方式)。 不幸的是,由於以下兩個原因,強制這樣的高度是不現實的:
似乎確實可以在這里使用流布局的固有內容大小。
故事板
約束
每個標簽,集合視圖和堆棧視圖之間都有大約15pt的空間(因此,垂直空間)。 集合視圖原型單元格中具有圖像視圖。 圖像視圖的頂部,底部,尾部和前導空間到集合視圖單元格都設置為0,並且比例為1:1。
集合視圖布局
為了實現一個大圖像和4個小圖像的布局,我使用了SNCollectionViewLayout 。
數據源/委托
在我的控制器中,在viewDidLoad
,將UITableView的estimatedRowHeight
viewDidLoad
設置為400,並將rowHeight
設置為UITableView.automaticDimension
。
在tableView cellForRowAt中,我使一個可重用的自定義UITableViewCell
類出隊,在表視圖單元格上設置各種出口,並在表視圖單元格的集合視圖上調用reloadData()
。 在情節提要中,我將表視圖單元格設置為集合視圖的數據源和委托。
在表格視圖單元的awakeFromNib
函數中,我已經設置了它的拐角半徑,陰影,並在集合視圖上使用以下代碼進行流程布局(您可以在其示例中看到):
let snCollectionViewLayout = SNCollectionViewLayout()
snCollectionViewLayout.fixedDivisionCount = 4
snCollectionViewLayout.delegate = self
snCollectionViewLayout.itemSpacing = 10
collectionView.collectionViewLayout = snCollectionViewLayout
我還通過編寫以下函數實現了可選的SNCollectionViewLayoutDelegate
協議:
func scaleForItem(inCollectionView collectionView: UICollectionView, withLayout layout: UICollectionViewLayout, atIndexPath indexPath: IndexPath) -> UInt {
if indexPath.row == 0 || collectionView.numberOfItems(inSection: indexPath.section) <= 2 {
return 2
} else {
return 1
}
}
這就是為什么第一張圖像的高度和寬度是其余圖像的兩倍的原因。
研究
為了弄清楚這一點,我檢查了表格視圖單元格的cellForRowAt和willDisplay方法內的collectionView.collectionViewLayout.collectionViewContentSize
。 無論哪種情況,它都是(0,0)。
我還嘗試在集合視圖單元格的cellForItemAt和willDisplay中對其進行檢查。 除非我在集合視圖中添加一個高度約束以使其變高,否則這些日志行甚至都不會打印,但是那時,我沒有一種好方法可以在任何時候將高度降低到應該的高度。嘗試過,我得到了沖突的約束警告和真正不穩定的拉伸視圖(例如完全壓縮了堆棧視圖)。
在測試中,我強行設置了一個足以使集合視圖適合的高度限制,並且當這種情況發生時,它可以正確呈現並且集合視圖內容的大小正確,因此我知道它能夠跟蹤(可以看到) 在這里 )。
有人對此有見識嗎? 如果您有任何需要研究的細節,我很樂意提供更多代碼。 我試圖提供完整的圖片,同時將圖片盡可能的短(我知道很長)。
我覺得問題與表格視圖單元格內的集合視圖有關。
提前致謝。
在表格視圖單元格中保持高度約束連接。
@IBOutlet weak var collectionViewHeightConstraint: NSLayoutConstraint!
並根據高度計算以編程方式更新高度限制值
self. collectionViewHeightConstraint.constant = 100 // set it to 0 if nothing to display
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.