• 水平方向瀑布流


    水平方向瀑布流

    效果

    源码

    https://github.com/YouXianMing/Animations

    //
    //  GridFlowLayoutViewController.m
    //  Animations
    //
    //  Created by YouXianMing on 16/5/5.
    //  Copyright © 2016年 YouXianMing. All rights reserved.
    //
    
    #import "GridFlowLayoutViewController.h"
    #import "UIView+SetRect.h"
    #import "GridLayout.h"
    #import "FlowStyleCell.h"
    #import "FileManager.h"
    #import "NSString+MD5.h"
    #import "NSData+JSONData.h"
    #import "ResponseData.h"
    #import "Math.h"
    #import "GCD.h"
    
    static NSString *picturesSource = @"http://www.duitang.com/album/1733789/masn/p/0/50/";
    
    @interface GridFlowLayoutViewController () <UICollectionViewDataSource, UICollectionViewDelegate, GridLayoutDelegate>
    
    @property (nonatomic, strong) UICollectionView  *collectionView;
    @property (nonatomic)         CGFloat            rowHeight;
    @property (nonatomic, strong) NSMutableArray    *datas;
    @property (nonatomic, strong) ResponseData      *picturesData;
    @property (nonatomic, strong) NSMutableArray    <WaterfallPictureModel *> *dataSource;
    
    @end
    
    @implementation GridFlowLayoutViewController
    
    - (void)setup {
        
        [super setup];
        
        _dataSource = [NSMutableArray new];
        
        // 初始化布局文件
        CGFloat gap               = 1;
        NSInteger rowCount        = arc4random() % 3 + 2;
        _rowHeight                = (self.contentView.height - (rowCount + 1) * gap) / (CGFloat)rowCount;
        GridLayout *layout        = [GridLayout new];
        layout.manager.edgeInsets = UIEdgeInsetsMake(gap, gap, gap, gap);
        layout.manager.gap        = gap;
        layout.delegate           = self;
        
        NSMutableArray *rowHeights = [NSMutableArray array];
        for (int i = 0; i < rowCount; i++) {
            
            [rowHeights addObject:@(_rowHeight)];
        }
        layout.manager.rowHeights = rowHeights;
        
        self.collectionView                                = [[UICollectionView alloc] initWithFrame:self.contentView.bounds
                                                                                collectionViewLayout:layout];
        self.collectionView.delegate                       = self;
        self.collectionView.dataSource                     = self;
        self.collectionView.backgroundColor                = [UIColor clearColor];
        self.collectionView.showsHorizontalScrollIndicator = NO;
        self.collectionView.alpha                          = 0;
        [self.collectionView registerClass:[FlowStyleCell class] forCellWithReuseIdentifier:@"FlowStyleCell"];
        [self.contentView addSubview:self.collectionView];
        
        // 获取数据
        [GCDQueue executeInGlobalQueue:^{
            
            NSString *string       = [picturesSource lowerMD532BitString];
            NSString *realFilePath = [FileManager theRealFilePath:[NSString stringWithFormat:@"~/Documents/%@", string]];
            NSData   *data         = nil;
            
            if ([FileManager fileExistWithRealFilePath:realFilePath] == NO) {
                
                data = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:picturesSource]];
                [data writeToFile:realFilePath atomically:YES];
                
            } else {
                
                data = [NSData dataWithContentsOfFile:realFilePath];
            }
            
            NSDictionary *dataDic = [data toListProperty];
            
            [GCDQueue executeInMainQueue:^{
                
                self.picturesData = [[ResponseData alloc] initWithDictionary:dataDic];
                if (self.picturesData.success.integerValue == 1) {
                    
                    for (int i = 0; i < self.picturesData.data.blogs.count; i++) {
                        
                        [_dataSource addObject:self.picturesData.data.blogs[i]];
                    }
                    
                    [_collectionView reloadData];
                    [UIView animateWithDuration:0.5f animations:^{
                        
                        _collectionView.alpha = 1.f;
                    }];
                }
            }];
        }];
    }
    
    - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
        
        return self.dataSource.count;
    }
    
    - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
        
        WaterfallPictureModel *pictureModel = _dataSource[indexPath.row];
        
        FlowStyleCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"FlowStyleCell" forIndexPath:indexPath];
        cell.indexPath      = indexPath;
        cell.data           = pictureModel;
        cell.rowHeight      = _rowHeight;
        [cell loadContent];
        
        return cell;
    }
    
    - (CGFloat)itemWidthWithIndexPath:(NSIndexPath *)indexPath {
        
        WaterfallPictureModel *pictureModel = _dataSource[indexPath.row];
        
        return  [Math resetFromSize:CGSizeMake(pictureModel.iwd.floatValue, pictureModel.iht.floatValue)
                    withFixedHeight:_rowHeight].width;
    }
    
    @end

    细节

    继承UICollectionViewLayout

    重载UICollectionViewLayout的四个方法

    部分实现细节

  • 相关阅读:
    poj 2186 && hdu 3836
    poj 2833 The Average
    hud 3062 Party
    论 ACM 与泡妞 (转载)
    poj 1064 Cable master
    poj Candies
    [转]人才流失的背后
    获取存储过程的ReturnValue值
    javascript js jquery获取元素位置代码总结
    【引用】xmlpath 操作 xml
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/5460903.html
Copyright © 2020-2023  润新知