簡體   English   中英

內在內容大小在UITableView內部的UICollectionView

[英]Intrinsic content sized UICollectionView inside UITableView

首先,請允許我說,過去幾個月來我在Google和StackOverflow上花費了100個小時來試圖回答這個問題。 我已經閱讀了許多教程,但無法解決我的問題。 每個人都很失望,令人沮喪。

期望

期望

現實

現實

問題

我有一個包含UIView的UITableView。 UIView具有自動布局約束,可將其固定在單元格邊緣的15pt處,然后給它陰影和圓角。 在該UIView中,我有一些標簽,然后是UICollectionView和堆棧視圖。

我的UICollectionView的高度始終為0,我不知道如何使其具有固有尺寸。 我似乎可以使其正確顯示的唯一方法是,通過情節提要板中的自動布局將其強制設置為特定的高度(這就是我截取此屏幕截圖的方式)。 不幸的是,由於以下兩個原因,強制這樣的高度是不現實的:

  1. 高度根據設備的寬度而變化。 由於圖像是正方形,因此高度大約是設備寬度的一半(但不完全是)。
  2. 如果沒有圖像,則集合視圖的高度應為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM