Ios6 UICollectionViewLayout示例

Ios6 UICollectionViewLayout示例,ios6,uicollectionview,uicollectionviewlayout,Ios6,Uicollectionview,Uicollectionviewlayout,有人能告诉我如何使用UICollectionViewLayout创建类似Pinterest列布局的界面吗 我试着在网上搜索,但似乎还没有太多的例子 我现在在一个项目中使用了瀑布的一个修改版本,我现在正在研究JSPint。1000memories“Cutter”视图类似于pinterest,并且是开源的:,您可以深入研究它的工作原理 如果你想要一个更具概念性的概述,这里是你想要做的基本想法。到目前为止,如果您只需要Pinterest样式的布局,那么最简单的事情就是将UICollectionVi

有人能告诉我如何使用UICollectionViewLayout创建类似Pinterest列布局的界面吗

我试着在网上搜索,但似乎还没有太多的例子

我现在在一个项目中使用了瀑布的一个修改版本,我现在正在研究JSPint。

1000memories“Cutter”视图类似于pinterest,并且是开源的:,您可以深入研究它的工作原理

如果你想要一个更具概念性的概述,这里是你想要做的基本想法。到目前为止,如果您只需要Pinterest样式的布局,那么最简单的事情就是将
UICollectionViewFlowLayout
子类化。您可以从这个类中获得很多布局帮助,Pinterest样式也在其能力范围内。您只需要重写一个方法

使用UICollectionViewFlow布局设置普通UICollectionView。实现这一点的快速方法是:

  • 将UIViewController拖到情节提要上,将UICollectionView拖到该情节提要上。将类设置为与自定义类相匹配,等等。您可以在此处使用委托并创建委托类,但严格来说,这并不是实现Pinterest流布局所必需的(但实际上,您几乎肯定希望将选择责任分解为委托类)
  • 删除一个数据源。为UICollectionView()实现数据源协议非常简单。确保在UICollectionViewCell上设置了重用标识符。你需要:
  • (NSInteger)SectionsInCollectionView的编号:(UICollectionView*)collectionView
    • 现在只返回1
  • (nsinteger)集合视图:numberOfItemsInSection:
    • 现在硬编码一个数字,设为20
  • (UICollectionViewCell*)collectionView:cellForItemAtIndexPath:
    • 这是流布局的子类化可以帮你一个忙的地方之一。这里真正需要做的就是使用索引路径调用
      dequeueReusableCellWithReuseIdentifier:forIndexPath:
      。如果在单元格中添加UIImageView或一些标签,这将是实际分配图像、文本等的好地方
  • 在viewController的
    viewDidLoad
    中实例化一个
    UICollectionViewFlowLayout
    ,并将UICollectionView的数据源设置为您的数据源,将布局设置为flowlayout。请记住,此类是
    uiCollectionViewController
    的子类

    self.collectionView.dataSource = [[YourDataSource alloc] init];
    self.collectionView.collectionViewLayout = [[UICollectionViewFlowLayout alloc] init];
    
嗯。此时,您应该能够运行应用程序并在屏幕上看到一些内容。这是一个旋风式的概述。如果您需要有关如何设置ViewController等的更多详细信息,可以使用大量相关资料

现在是重要的部分,Pinterest将流程布局细化

首先,添加一个新类,该类是UIViewControllerFlowLayout的子类。更改ViewController的
viewDidLoad
以实例化该类并将其指定为
UICollectionView
collectionViewLayout

您需要实现的方法是
-(NSArray*)layouttributesforementsinrect:(CGRect)rect

事情是这样的:超类将为您完成几乎所有的工作。您的代码将如下所示:

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    NSArray *attributes = [super layoutAttributesForElementsInRect:rect]; 
    [attributes enumerateObjectsUsingBlock:^(id attr, NSUInteger idx, BOOL *stop) {
    float newYCoord = [calculationMethodYouHaveToWriteFor:attr.frame];
    attr.frame = CGRectMake(attr.frame.origin.x, newYCoord, attr.size.width, attr.size.height];
}];

}
Pinterest使用固定宽度的列,在计算方法中只需计算出您所在的列(`attr.origin.x/_columnWidth),然后从保存该列的ivar中查找该列的总高度。不要忘记将其添加到新对象的高度,并将其保存回下一个过程


流布局超类处理:生成单元格、确定哪些单元格可见、计算内容大小、计算行在x方向的排列、为单元格指定索引路径。很多垃圾。覆盖这一方法可以让您随心所欲地摆弄y-pos。

我创建了一个自定义uicollectionviewlayout,用于我的个人项目。这里是链接。希望能有帮助


您可以从这里获得任何想要的东西: 例如(这两种布局都是自定义UICollectionViewLayout):


此时我得到一个零数组NSArray*attributes=[super-layouttributesforementsinrect:rect]。如果我不覆盖collectionViewLayout,则会显示我的集合视图