簡體   English   中英

CollectionViewCell 相對於 CollectionView 的自動布局大小

[英]Auto Layout size of CollectionViewCell in relation to CollectionView

我在 CollectionView 中放置了一個 CollectionViewCell。 CollectionView 的大小是通過自動布局設置的,並且可以不時更改。

我想(以編程方式)在我的 CollectionView 上設置約束,以便 CollectionViewCell 的大小響應於 CollectionView 的大小(假設 Cell 的寬度等於 CollectionView-100 的寬度並且高度應該相等)。

如何聲明 Cell 和 CollectionView 之間的約束?

何時、何地以及如何設置這些約束? 當 CollectionView 的大小發生變化時,我是否必須在單元格上調用 setNeedsLayout ?

我搜索了很長時間,我發現的總是關於根據內容更改單元格的大小——這不是我想要做的。 我得到的唯一提示是我可能必須繼承 CollectionViewLayout - 但我不確定這一點。

任何幫助表示贊賞!

您無法使用約束來實現這一點,但是您可以使用UICollectionViewDelegatesizeForItemAtIndexPath方法輕松地做到這一點。 例子:

func collectionView(collectionView: UICollectionView, 
       layout collectionViewLayout: UICollectionViewLayout,
  sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
    return CGSize(width: collectionView.frame.size.width / 2, height: collectionView.frame.size.height/ 2)
}

在更改collectionView大小后,您需要做的就是調用其reloadData方法。

我可以為您建議兩種方法來做到這一點:

  1. 在您的 UIViewController 中嘗試在viewDidLayoutSubviews方法中設置collectionViewLayout屬性。 我不確定當屏幕方向改變時它是否有效。
- (void)viewDidLayoutSubviews
{
  UICollectionViewFlowLayout *flow  = YOUR_COLLECTION_VIEW.collectionViewLayout;
  float width = CGRectGetWidth(YOUR_COLLECTION_VIEW.frame)-100.f;
  float height = CGRectGetHeight(YOUR_COLLECTION_VIEW.frame);
  YOUR_COLLECTION_VIEW.collectionViewLayout = flow;
}
  1. 如果這不起作用,那么我 100% 確定它會起作用,如果您將 collectionView 子類化並插入相同的代碼但在(void)layoutSubviews

UICollectionViewDelegateFlowLayout sizeForItemAt方法中設置單元格高度並獲取集合視圖高度。 如果更合適,您可以根據整數設置單元格大小或乘以百分比。

func collectionView(_ collectionView: UICollectionView, layout 
collectionViewLayout: UICollectionViewLayout, sizeForItemAt 
indexPath: IndexPath) -> CGSize {
        let heigh = collectionView.frame.height
        let widthOfCell = collectionView.frame.width - 100 // OP request
        return CGSize(width: width, height: height) 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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