2015-06-18 80 views
2

我有一個CollectionViewCell放置在CollectionView中。 CollectionView的大小通過自動佈局進行設置,並且可以隨時更改。CollectionViewCell與CollectionView的自動佈局大小

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

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

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

我搜索了這麼長時間,我發現的總是根據其內容改變單元的大小 - 這不是我想要做的。我得到的唯一提示是我可能必須子類CollectionViewLayout - 但我不確定這一點。

任何幫助表示讚賞!

回答

3

你不能通過使用約束來實現這一點,但你可以通過使用UICollectionViewDelegate方法很容易地做到這一點。例如:

func collectionView(collectionView: UICollectionView, 
        layout collectionViewLayout: UICollectionViewLayout, 
    sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize{ 

    return CGSizeMake(collectionView.frame.size.width/2 ,collectionView.frame.size.height/ 2) 
} 

和不斷變化的CollectionView大小後,所有你需要做的就是調用其reloadData方法

+0

我必須把這個在我的CollectionView的大小發生變化後再次使用函數以便單元格適應? – chl

+0

是的,您每次需要調用'reloadData'時,collectionView的大小會發生變化 –

+0

如果我使用Core Animation來動畫改變CollectionView的大小(animateWithDuration和layoutIfNeeded,如http://www.objc.io/issues/3-views /高級自動佈局工具箱/#動畫)我必須經常設置某種間隔和調用reloadData嗎?因爲可能沒有辦法知道CollectionView的最終尺寸,所以我不能在Cell上使用animiationWithDuration ... – chl

0

我可以建議U 2周的方式如何做到這一點: 1)在UIViewController嘗試設置collectionViewLayout財產viewDidLayoutSubviews方法。我不確定屏幕方向是否會發生變化。

- (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; 
} 

如果它沒有給出一個必要的作用,我100%確信當U子類的CollectionView和插入相同的代碼,但在它的工作 - (void)layoutSubviews

相關問題