`
zjjzmw1
  • 浏览: 1367823 次
  • 性别: Icon_minigender_1
  • 来自: 开封
社区版块
存档分类
最新评论

UICollectionViewFlowLayout 瀑布流

    博客分类:
  • iOS
阅读更多
 
Tip: 自己开发了好玩的APP: 《小明搜索》(App Store上搜索:"小明搜索")
[点击下载 "小明搜索"](https://itunes.apple.com/cn/app/小明搜索/id1378798470?l=en&mt=8)
1、集必应、百度、搜狗为一体的搜索平台
2、用户随意收藏或添加自己喜欢的网站
3、网页文字播放功能
4、收藏网页的视频,本地播放
5、附加常用小工具
6、后台播放网页音频
7、3D Touch提供便捷入口
完全自定义的搜索助手,简约的爱不释手~
该APP不断完善中~
#import <UIKit/UIKit.h>

@interface CustomFlowLayout : UICollectionViewFlowLayout

@property(nonatomic, assign)IBOutlet id <UICollectionViewDelegateFlowLayout> delegate;
@end
 

#import "CustomFlowLayout.h"

@interface CustomFlowLayout ()<UICollectionViewDelegateFlowLayout>
@property(nonatomic, strong)NSMutableArray* attributeArray;

@property(nonatomic, strong)UICollectionViewLayoutAttributes* headerAttributes;
@property(nonatomic, strong)UICollectionViewLayoutAttributes* footerAttribytes;
@end

@implementation CustomFlowLayout


- (void)prepareLayout{
    self.attributeArray = [[NSMutableArray alloc] init];
    [super prepareLayout];
   
    NSInteger numberOfSections = 1;
   
    //行数
    if([self.collectionView.dataSource respondsToSelector:@selector(numberOfSectionsInCollectionView:)]){
        numberOfSections = [self.collectionView.dataSource numberOfSectionsInCollectionView:self.collectionView];
    }
   
   
    CGFloat totalHeight = 0;
    CGFloat itemSpacing = self.minimumInteritemSpacing;
    for (int i = 0; i < numberOfSections; i++) {
       
        NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:i];

        UIEdgeInsets sectionInset = self.sectionInset;
        if([self.delegate respondsToSelector:@selector(collectionView:layout:insetForSectionAtIndex:)]){
            sectionInset = [self.delegate collectionView:self.collectionView layout:self insetForSectionAtIndex:i];
        }

        CGSize  sectionHeaderSize = self.headerReferenceSize;
        CGSize  sectionFooterSize = self.footerReferenceSize;
       
        if([self.delegate respondsToSelector:@selector(collectionView:layout:referenceSizeForHeaderInSection:)]){
            sectionHeaderSize = [self.delegate collectionView:self.collectionView layout:self referenceSizeForHeaderInSection:i];
        }
        if([self.delegate respondsToSelector:@selector(collectionView:layout:referenceSizeForFooterInSection:)]){
            sectionFooterSize = [self.delegate collectionView:self.collectionView layout:self referenceSizeForFooterInSection:i];
        }       
       
        CGFloat colHeight[2] = {0, 0};
       
        UICollectionViewLayoutAttributes* attribute;
       
        if(sectionHeaderSize.height > 0){
            attribute = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionHeader withIndexPath:indexPath];
            attribute.frame = CGRectMake(sectionInset.left, sectionInset.top + totalHeight, sectionHeaderSize.width, sectionHeaderSize.height);
            [self.attributeArray addObject:attribute];
        }
       
        if(sectionFooterSize.height > 0){
            attribute = [UICollectionViewLayoutAttributes layoutAttributesForSupplementaryViewOfKind:UICollectionElementKindSectionFooter withIndexPath:indexPath];
            attribute.frame = CGRectMake(sectionInset.left, sectionInset.top, sectionFooterSize.width, sectionFooterSize.height);
            [self.attributeArray addObject:attribute];
        }
       
        totalHeight += sectionHeaderSize.height;
        totalHeight += sectionFooterSize.height;
       
        NSInteger numberOfItemsInSection = 0;
        if([self.collectionView.dataSource respondsToSelector:@selector(collectionView:numberOfItemsInSection:)]){
            numberOfItemsInSection = [self.collectionView.dataSource collectionView:self.collectionView numberOfItemsInSection:i];
        }
        for (int j = 0; j < numberOfItemsInSection; j++) {
            NSIndexPath *indexPath = [NSIndexPath indexPathForItem:j inSection:i];
           
            UICollectionViewLayoutAttributes * attris = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
            CGSize size = CGSizeZero;
            NSInteger colum = 0;

            if([self.delegate respondsToSelector:@selector(collectionView:layout:minimumInteritemSpacingForSectionAtIndex:)]){
                itemSpacing =  [self.delegate collectionView:self.collectionView layout:self minimumInteritemSpacingForSectionAtIndex:i];
            }
           
           
            if([self.delegate respondsToSelector:@selector(collectionView:layout:sizeForItemAtIndexPath:)]){

                size = [self.delegate collectionView:self.collectionView layout:self sizeForItemAtIndexPath:indexPath];
                if(colHeight[0] <= colHeight[1]){
                    colHeight[0] = colHeight[0] + size.height + itemSpacing;
                    colum = 0;
                }else{
                    colHeight[1] = colHeight[1] + size.height + itemSpacing;
                    colum = 1;
                }
            }
                   
            attris.frame = CGRectMake(sectionInset.left + (itemSpacing + size.width) * colum, colHeight[colum] - size.height - itemSpacing + totalHeight, size.width, size.height);
           
            [self.attributeArray addObject:attris];
           
        }
       
        CGFloat maxHeight = MAX(colHeight[0], colHeight[1]);
       
        totalHeight += (maxHeight -itemSpacing);
    }
       
}

- (CGSize)collectionViewContentSize{
    CGRect frame = [[self.attributeArray lastObject] frame];
    return CGSizeMake(self.collectionView.frame.size.width, frame.origin.y + frame.size.height);
}

- (NSArray<UICollectionViewLayoutAttributes*> *)layoutAttributesForElementsInRect:(CGRect)rect{
   
    return self.attributeArray;
}

- (nullable UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath{
    return self.headerAttributes;
}

 

@end
0
4
分享到:
评论

相关推荐

    swift-CollectionView-WaterFlowLayout瀑布流框架搭建

    瀑布流布局的核心在于UICollectionViewFlowLayout的自定义。默认的布局是水平和垂直滚动的一维布局,我们需要扩展它以实现多列布局。在Swift中创建一个继承自UICollectionViewFlowLayout的新类,重写`...

    ios瀑布流实现

    在这个文章中,作者可能会介绍如何设置UICollectionView,以及如何通过自定义UICollectionViewFlowLayout来实现瀑布流布局。通常,这些步骤会包括以下几个部分: 1. 创建UICollectionView并设置数据源和代理。 2. ...

    瀑布流UIcollectionViewLayout(swift)

    在这个"瀑布流UIcollectionViewLayout(swift)"项目中,开发者利用Swift语言创建了一个自定义的UICollectionViewFlowLayout,使得每个单元格可以根据内容自动调整大小,形成连续的多列布局。 首先,我们需要了解...

    swift-可横竖向切换的瀑布流布局

    1. UICollectionViewFlowLayout:这是UICollectionView的默认布局,但它并不支持瀑布流布局。为了实现瀑布流布局,我们需要自定义UICollectionViewLayout。自定义布局需要重写以下方法: - `prepare()`: 在这里...

    ios 瀑布流不同的实现方式

    UICollectionViewFlowLayout是UICollectionView的默认布局,虽然它不直接支持瀑布流,但可以通过一些技巧进行改造。例如,可以为每个section设置不同的columnCount(列数),并通过监听UICollectionView的size变化...

    oc瀑布流小测试

    在Objective-C中,你可以使用UICollectionView来实现瀑布流布局,利用UICollectionViewFlowLayout进行自定义布局。Swift中则有类似的功能,但语法和API设计更现代化。 总的来说,这个“oc瀑布流小测试”项目可能是...

    自定义横向瀑布流,实现重用,优化内存

    在项目压缩包中的"横向瀑布流"文件可能包含了实现这个功能的源代码,包括UICollectionView的子类、UICollectionViewCell的子类、自定义UICollectionViewFlowLayout的实现,以及可能的模型类和数据源管理代码。...

    ios-瀑布流简易实现.zip

    2. **设置UICollectionViewFlowLayout**:默认的UICollectionViewFlowLayout无法满足瀑布流的需求,因此我们需要继承UICollectionViewFlowLayout并重写其方法。主要需要重写以下几个方法: - `...

    ios uicollectionview实现瀑布流

    首先,要实现`UICollectionView`的瀑布流,我们需要理解并自定义UICollectionViewFlowLayout。这个布局类是UICollectionView的基础,它定义了cell的排列方式,间距,方向等。在`UICollectionViewFlowLayout`中,我们...

    瀑布流适用手机

    瀑布流布局,又称Masonry布局,是一种常见的网页和应用界面设计模式,特别是在手机端的使用相当广泛。这种布局方式模仿了瀑布下落的自然现象,使得内容元素(如图片、文字或商品)能够自上而下、从左到右连续排列,...

    iOS开发中的瀑布流

    2. 创建自定义UICollectionViewFlowLayout:实现瀑布流的布局逻辑。 3. 注册单元格类:使用`registerClass: forCellWithReuseIdentifier:`或`registerNib: forCellWithReuseIdentifier:`方法。 4. 在`collectionView...

    ios-自定义瀑布流(可添加自定义header和footer).zip

    3. **WaterfallFlowLayout.swift**:瀑布流布局的自定义布局类,它继承自UICollectionViewFlowLayout。在这个类里,主要逻辑包括计算每个cell的位置,以及处理不同大小的item和屏幕尺寸的适配。 4. **...

    iOS开发之瀑布流

    开发者可以创建自定义UICollectionViewFlowLayout,重写其中的`layoutAttributesForElements(in:)`和`sizeForItemAt(_:)`方法,以实现瀑布流效果。 3. **UICollectionViewDataSource** 和 **...

    iOS UICollectionView实现瀑布流

    1. **UICollectionViewFlowLayout**: 这是UICollectionView的基础布局类,我们可以通过自定义UICollectionViewFlowLayout来实现瀑布流效果。首先,我们需要创建一个继承自UICollectionViewFlowLayout的子类,并重写...

    iOS 瀑布流

    在iOS开发中实现瀑布流,主要涉及到自定义UICollectionViewFlowLayout和网络图片加载等内容。以下是对这个iOS瀑布流Demo的详细解读。 首先,瀑布流的核心在于UICollectionView,它是iOS中的一个强大的视图组件,...

    ios-简单的圆形瀑布流.zip

    在这个项目中,"COXRoundFlowLayout"可能是一个自定义的UICollectionViewFlowLayout子类,用于创建这种独特的圆形瀑布流效果。 首先,我们来详细了解一下瀑布流布局。瀑布流布局主要应用于UICollectionView,它是...

    MyFlowLayout(瀑布流)

    `MyFlowLayout`就是一个这样的自定义布局类,它扩展了UICollectionViewFlowLayout,使得在iOS应用中可以轻松实现瀑布流效果。开发者可以通过设置不同的列数、间距等属性来自定义布局。 `SDWebImage`是iOS开发中的一...

    swift-瀑布流网络图片瀑布流

    3. **自定义UICollectionViewFlowLayout**:UICollectionView是iOS中实现瀑布流布局的主要组件。你需要创建一个自定义的UICollectionViewFlowLayout,重写`layoutAttributesForElements(in:)`方法来计算每个cell的...

    iOS-瀑布流布局

    瀑布流布局,又称为Masonry布局,是一种在iOS应用中常用的设计模式,特别是在展示大量图片或者商品信息时,能够提供良好的用户体验。这种布局方式模仿了真实世界中瀑布流水的效果,使得屏幕上的元素自上而下排列,每...

    IOS图文混编瀑布流

    - UICollectionViewFlowLayout:默认的布局方式,支持水平或垂直滚动,但不支持瀑布流。为了实现瀑布流,我们需要自定义UICollectionViewLayout子类。 - 自定义布局:需要重写`layoutAttributesForElements(in:)`...

Global site tag (gtag.js) - Google Analytics