iOS开发

自定义的UICollectionViewFlowLayout不执

2017-02-21  本文已影响2699人  phzean

直接入正题,那就。请看下面的代码

    //设置layout
    PZFlowLayout *layout = [[PZFlowLayout alloc] init];
    layout.itemCount = cellNumber;
    layout.scrollDirection       = UICollectionViewScrollDirectionVertical;
    layout.itemSize              = CGSizeMake(100, 100);
    layout.minimumLineSpacing    = 20;  //默认是10
    layout.headerReferenceSize = CGSizeMake(fDeviceWidth, 200);//头部
    
    //初始化
    UICollectionView *collectView = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:layout];
    //注册cell
    [collectView registerNib:[UINib nibWithNibName:NSStringFromClass([PZFlowCollectionViewCell class]) bundle:nil] forCellWithReuseIdentifier:PZFlowCollectionViewCellIdentifierID];
    [collectView registerNib:[UINib nibWithNibName:NSStringFromClass([PZFlowCollectionHeaderView class]) bundle:nil] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:PZFlowCollectionHeaderViewIdentifierID];
    //设置代理
    collectView.delegate = self;
    collectView.dataSource = self;
    [collectView flashScrollIndicators];
    _homeCollectionView = collectView;

是不是感觉没毛病,但是上面的代码添加过后 - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath这个方法是不会执行 ~~,一脸懵逼了,咋回事啊,然后尝试着将自定义的类PZFlowLayout换成系统的 UICollectionViewFlowLayout 类,我只能说自家人就是好说话,更换之后就真的没有毛病了,viewForSupplementaryElementOfKind:方法妥妥的执行。可是这样一来,就不能装逼了啊,幸好找到一位大神 @来自南方的熊
解决方法就是在自定义的PZFlowLayout.m类中添加一个UICollectionElementKindSectionHeader的属性,代码如下

- (void)prepareLayout{
  [super prepareLayout];
  _attributeArray = [NSMutableArray array];
  //头部视图
  UICollectionViewLayoutAttributes * layoutHeader = [UICollectionViewLayoutAttributes   layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeader withIndexPath:[NSIndexPath indexPathWithIndex:0]];
  layoutHeader.frame =CGRectMake(0,0, 375, 200);
  [_attributeArray addObject:layoutHeader];
}
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{
  return _attributeArray;
}

添加了这个属性之后,上面一段代码中的layout.headerReferenceSize = CGSizeMake(fDeviceWidth, 200);//头部就可以不要了。
好了,就酱。

项目的github地址

上一篇下一篇

猜你喜欢

热点阅读