2015-06-18 77 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

相关问题