UICollectionView 不同大小Cell 等间距的实现

在IOS项目中有时会用到UICollectionView控件,大家应该都不太陌生,即便有没用过的同学,看一下教程也能轻松的掌握。不过要实现cell大小不同,又要等间距,应该怎么做呢?如下图:

一、首先需要创建EqualSpaceFlowLayout继承UICollectionViewFlowLayout,如下面的代码:

#import <UIKit/UIKit.h>

@protocol  EqualSpaceFlowLayoutDelegate<UICollectionViewDelegateFlowLayout>
@end

@interface EqualSpaceFlowLayout : UICollectionViewFlowLayout
@property (nonatomic,weak) id<EqualSpaceFlowLayoutDelegate> delegate;
@end

在EqualSpaceFlowLayout.m文件中重载- (void)prepareLayout方法实现每个cell的布局,如下

#pragma mark - Methods to Override
- (void)prepareLayout
{
    [super prepareLayout];

    NSInteger itemCount = [[self collectionView] numberOfItemsInSection:0];
    self.itemAttributes = [NSMutableArray arrayWithCapacity:itemCount];

    CGFloat xOffset = self.sectionInset.left;
    CGFloat yOffset = self.sectionInset.top;
    CGFloat xNextOffset = self.sectionInset.left;
    for (NSInteger idx = 0; idx < itemCount; idx++) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:idx inSection:0];
        CGSize itemSize = [self.delegate collectionView:self.collectionView layout:self sizeForItemAtIndexPath:indexPath];

        xNextOffset+=(self.minimumInteritemSpacing + itemSize.width);
        if (xNextOffset > [self collectionView].bounds.size.width - self.sectionInset.right) {
            xOffset = self.sectionInset.left;
            xNextOffset = (self.sectionInset.left + self.minimumInteritemSpacing + itemSize.width);
            yOffset += (itemSize.height + self.minimumLineSpacing);
        }
        else
        {
            xOffset = xNextOffset - (self.minimumInteritemSpacing + itemSize.width);
        }

        UICollectionViewLayoutAttributes *layoutAttributes =
        [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];

        layoutAttributes.frame = CGRectMake(xOffset, yOffset, itemSize.width, itemSize.height);
        [_itemAttributes addObject:layoutAttributes];
    }
}

最后返回每个cell的layout情况

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
    return (self.itemAttributes)[indexPath.item];
}

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
{
    return [self.itemAttributes filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(UICollectionViewLayoutAttributes *evaluatedObject, NSDictionary *bindings) {
        return CGRectIntersectsRect(rect, [evaluatedObject frame]);
    }]];
}

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
    return NO;
}

提供项目下载地址:http://download.csdn.net/detail/chchong1234/8692121

时间: 2024-08-25 14:02:48

UICollectionView 不同大小Cell 等间距的实现的相关文章

UICollectionView设置item(cell)之间间距为0(紧挨在一起的效果)

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; self.layout = layout; // 设置每格的大小 layout.itemSize = CGSizeMake(DD_SCREEN_WIDTH * 0.5, 80); // 上左下右间距 layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0); layout.minimumLine

iOS开发实战——CollectionView中cell的间距设置

我在前面多篇博客中详细讲解了CollectionView的使用与自定义CollectionViewCell的设计,可以参考<iOS开发实战--CollectionView点击事件与键盘隐藏结合案例><iOS高级开发--CollectionView修改cell的文本及模型重构>这几篇博客.但是今天还是需要来讲讲CollectionView实现中的一个小小的坑,这是我最近在网上浏览时发现很多开发者经常犯的错,所以我觉得有必要来好好谈一谈. 一个CollectionView控件中,两个c

UICollectionView reloadData后cell被隐藏

在使用UICollectionView的页面执行: [self.collectionView reloadData]; 执行后,页面变为空白页,调试发现,执行reloadData 后UICollectionView的cell的hidden都变为YES. stackoverflow上很多人说这是UICollectionView的一个bug, 有人给出了解决方案,即在主线程调用reloadData: dispatch_async(dispatch_get_main_queue(), ^{ [self

调整cell的间距

-(instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{ if (self == [super initWithStyle:style reuseIdentifier:reuseIdentifier]) { self = [[NSBundle mainBundle] loadNibNamed:@"MessageNotificationTableView

自定义UIView整理(1)

1.UICollectionView实现不同大小cell等间距 下载地址:http://download.csdn.net/detail/chchong1234/8692121

ios开发——解决UICollectionView的cell间距与设置不符问题

在用UICollectionView展示数据时,有时我们希望将cell的间距调成一个我们想要的值,然后查API可以看到有这么一个属性: - (CGFloat)minimumInteritemSpacing { return 0; } 然而很多情况下我们会发现,这样写不能满足我们的要求,cell之间仍然有一个不知道怎么产生的间距. 我们知道cell的间距是由cell的大小itemSize和section的缩进sectionInset共同决定的,通过这两个数据,UICollectionView动态地

ios开发――解决UICollectionView的cell间距与设置不符问题

在用UICollectionView展示数据时,有时我们希望将cell的间距调成一个我们想要的值,然后查API可以看到有这么一个属性: - (CGFloat)minimumInteritemSpacing { return 0;} 然而很多情况下我们会发现,这样写不能满足我们的要求,cell之间仍然有一个不知道怎么产生的间距. 我们知道cell的间距是由cell的大小itemSize和section的缩进sectionInset共同决定的,通过这两个数据,UICollectionView动态地将

C#控制条码打印机 纸张大小,间距,绘制内容(所有条码打印机通用)

其他条码知识 请访问:http://www.ybtiaoma.com ,本文仅供参考,请勿转载,谢谢 using System; using System.Drawing; using System.Drawing.Printing; using System.Runtime.InteropServices; using System.Windows.Forms; /*2014-11-20 * 测试打印机 新北洋BTP-2100E Plus 西铁城CLP-S631 * 测试结果:页面大小,上间距

比 UICollectionView更好用的IGListKit教程

原文:IGListKit Tutorial: Better UICollectionViews 作者:Ryan Nystrom 译者:kmyhy 每个 app 都以同样的方式开始:几个界面,几颗按钮,一两个 list.但随着进度的进行以及 app 膨胀,功能开始发生变化.你简单的数据源开始在工期和产品经理的压力下变得支离破碎.再过一久,你留下一堆庞大得难以维护的 view controller.今天,IGListKit 来拯救你了! IGListKit 专门用于解决在使用 UICollectio