我有一個堆棧視圖,其中包含三個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() }
凡collectionView
是UIStackView
和view
裏面是UIViewController
的主視圖。這允許所有基於視圖大小的後續計算都是正確的,並且如果UIStackView
行爲得到解決,希望不會被調用。
類似的討論here和here。有趣的是,在XCode8中,新的默認設置是不保存XIB文件中視圖的大小,而是將所有內容以1000x1000的初始大小放入,以便在第一次佈局過程中解決。我猜想除了UIStackView
之外。