2017-02-24 243 views
14

我想UICollectionView(紅色的)收縮到內容大小的高度,在這種情況下UICollectionViewCells(黃色的),因爲有很多空的空間。我試過是使用:如何將UICollectionView的高度調整爲UICollectionView內容大小的高度?

override func layoutSubviews() { 
    super.layoutSubviews() 
    if !__CGSizeEqualToSize(bounds.size, self.intrinsicContentSize) { 
     self.invalidateIntrinsicContentSize() 
    } 
} 

override var intrinsicContentSize: CGSize { 
    return self.collection.contentSize 
} 

return self.collection.contentSize總是返回(寬度,0) 基於這個原因,它縮小太多,高度30(該值的價值,我在廈門國際銀行文件中設置的高度,儘管我有> = 30)。

enter image description here

+0

您已經採取高度限制出口的ColletionView並像這樣調整高度'heightConstraint.constant = collectionView.contentSize.height' –

+0

您使用自定義佈局還是Apple提供的 - UICollectionViewFlowLayout? –

+0

我使用的是默認的UICollectionViewFlowLayout – charbinary

回答

32

我建議如下:

  1. 將高度約束添加到您的集合視圖。
  2. 將其優先級設置爲999.
  3. 將其常量設置爲任何只能在故事板上合理可見的值。
  4. 將集合視圖的底部相等約束更改爲大於或等於。
  5. 將高度限制連接到插座。
  6. 你重裝上收集的數據來看每次執行以下操作:

代碼示例:

CGFloat height = myCollectionView.collectionViewLayout.collectionViewContentSize.height 
heightConstraint.constant = height 
self.view.setNeedsLayout() Or self.view.layoutIfNeeded() 

說明:額外的,你就不用看了,如果你明白這一點。明顯!!

無論他們的優先級是什麼,UI都會嘗試反映所有約束。由於高度約束具有較低的優先級(999)以及類型大於或等於的底部約束。每當將高度約束常數設置爲小於父視圖高度的值時,集合視圖將等於給定高度,從而實現兩個約束。

但是,當高度約束常數設置爲大於父視圖高度的值時,無法實現兩個約束。因此,只有較高優先級的約束條件才能實現,即較大或相等的底部約束條件。

以下只是一個經驗猜測。所以,它實現了一個限制。但是,它還嘗試在結果UI中使錯誤爲其他未實現的較低優先級約束儘可能最低。因此,集合視圖高度將等於父視圖大小。

+1

完美答案非常感謝! – karenms

+0

@ hasan83,兄弟請你看看我的問題https://stackoverflow.com/questions/46034278/how-to-adjust-uiview-height-according-to-the-collection-view-content-height- in-s?noredirect = 1#comment79054393_46034278? –

+0

礦山在一定程度上擴張,但不完善。它錯過了大約3 4行的標籤。任何想法?下面是它的外觀:https://ibb.co/jeO9Rv https://ibb.co/iV8b6v – Nil

0

第一單元的所有計算數量比細胞高度增殖,然後在這個方法返回高度

collectionView.frame = CGRectMake (x,y,w,collectionView.collectionViewLayout.collectionViewContentSize.height); //objective c 
    //[collectionView reloadData]; 
    collectionView.frame = CGRect(x: 0, y: 0, width: width, height: collectionView.collectionViewLayout.collectionViewContentSize.height) // swift 
+0

這個方法返回的大小在指數路徑特定的細胞,如果你設置了高度noOfCell * heightOfCell這將設置所有單元格的高度。 –

+0

@Georgi Boyadzhiev,這是真的。 – charbinary

3

你必須設置高度約束爲等於內容大小

HeightConstraint.constant = collection.contentSize.height 
1

做以下。

  1. 第一套高度限制爲UICollectionView
  2. 這裏calendarBaseViewHeightUICollectionView高度可變
  3. 調用函數重載集合視圖後

    func resizeCollectionViewSize(){ 
         calendarBaseViewHeight.constant = collectionView.contentSize.height  
    } 
    
相關問題