UICollectionViewCells的不规则位置

时间:2015-09-11 04:37:11

标签: ios objective-c

你们中有没有人可以给我一个如何创建视图的提示,就像我在下面发布的一样?

enter image description here

我知道我可以在这种方法中改变的大小:

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;

但是我如何才能改变每个UICollectionViewCell的位置?

任何帮助都将非常感激。感谢

1 个答案:

答案 0 :(得分:0)

您需要创建自定义UICollectionViewLayout并使用自定义布局实例化UICollectionViewController。有关Apple参考,请参阅:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UICollectionViewLayout_class/

布局的一般架构如下:

prepareLayout在此处,您可以进行任何预先布局计算,以确定视图应放置在集合视图中的哪个位置。一种解决方案是在prepareLayout中更新CGRect数组,以表示屏幕上元素的位置。

layoutAttributesForElementsInRect:此方法确定在给定可见矩形的屏幕上显示哪些视图。如果您有一个CGRect的数组,如上所述,这就像循环数组并确定可见矩形是否与计算的单元格矩形相交一样简单。

layoutAttributesForItemAtIndexPath:此方法为给定的indexPath返回UICollectionViewLayoutAttributes。根据您的数据结构,这可能就像在CGRect indexPath抓取计算出的item并在布局属性上设置它一样简单。快速提示:首先调用[super layoutAttributesForItemAtIndexPath: indexPath],然后修改返回属性的frame属性。

最后,您需要确保正确计算collectionViewContentSize。否则,您的collectionView将不知道其内部内容应该有多大。如果内容大小比屏幕宽,则滚动水平,如果它更高,则滚动垂直。这一切都取决于您需要布局做什么。也就是说,您当然可以创建不会显示滚动的布局,但使用滚动来触发屏幕上的布局更改。要做到这一点,你需要确保利用:

shouldInvalidateLayoutForBoundsChange:每次有边界变化(即滚动)时都会调用此方法。如果返回true,则每次滚动迭代都会调用prepareLayout链。您必须小心,您的布局逻辑很快,否则您可能会遇到性能问题,但如果使用得当,您可以创建一些非常独特的布局!