4

我有一個堆棧視圖,其中包含三個UICollectionViews,這些視圖被設置爲賦予它們每個相等的垂直空間。該堆棧視圖設置爲顯示器一半的高度,以便在較大的設備上使用更多空間。這已經在Interface Builder中設置。在運行時設置UICollectionViewCellSize

所以,我需要在運行時設置UICollectionView的單元大小,因爲直到我們運行時,我不知道單元格的實際大小是多少。我希望它們是方形的,所以我只想考慮UICollectionView的高度,減去頂部和底部部分的插圖,並將itemSize設置爲最終的尺寸。

我試圖在viewDidLayoutSubviews中做到這一點,因爲那時我認爲已經設置了集合視圖的初始高度。但是,它們似乎設置爲1000x1000(即使它在故事板中的尺寸更合理),因此我根據1000的集合視圖高度計算單元尺寸。這太大了,但我認爲我我們會再次打電話,並有機會重新計算它。而我呢,但UICollectionView之前沒有抱怨大聲的itemSize是不正確的(即過大,以適應collectionView,現在有「正確」的大小。)

什麼是讓行爲我的最佳方式尋找沒有來自UICollectionView的警告?根據UICollectionView的最終尺寸在運行時設置集合視圖項目大小是我過去一直在努力的事情,似乎從未有過設置itemSize的「正確」時間。我不想動態地返回它,如果僅僅是因爲它在程序的生命期間沒有改變。剛開始佈置視圖時,似乎存在一些不一致之處。

對我來說,集合視圖初始大小爲1000.0,1000.0似乎很奇怪,但我不確定如何或爲什麼要修復它 - 也許它與嵌入堆棧視圖有關?

編輯爲:幾乎肯定是UIStackView是導致佈局問題。我創建了一個虛擬項目來測試UICollectionView的大小,當它是頂級視圖vs嵌入在UIStackView中時。如果未嵌入,則調用viewDidLayoutSubviews時,它的大小適合其superview的範圍。但是,如果它位於UIStackView的內部,它將保持默認大小爲1000x1000。

現在,我解決這個問題viewDidLayoutSubviews工作中加入以下代碼:

if collectionView.bounds.size.width > view.bounds.size.width { 
     view.layoutIfNeeded() 
    } 

collectionViewUIStackViewview裏面是UIViewController的主視圖。這允許所有基於視圖大小的後續計算都是正確的,並且如果UIStackView行爲得到解決,希望不會被調用。

類似的討論herehere。有趣的是,在XCode8中,新的默認設置是不保存XIB文件中視圖的大小,而是將所有內容以1000x1000的初始大小放入,以便在第一次佈局過程中解決。我猜想除了UIStackView之外。

回答

0

您是否有sizeForItemAtIndexPath()退貨itemSize?我發現實現該功能是在運行時動態調整UICollectionViewCell的唯一可靠方法。