iOS实现水平方向瀑布流_IOS

效果

源码: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的四个方法

部分实现细节

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索iOS纵向瀑布流
iOS瀑布流
ios瀑布流的实现、ios瀑布流的实现原理、ios瀑布流实现原理、ios 瀑布流 水平、瀑布流布局实现,以便于您获取更多的相关知识。

时间: 2024-10-13 20:09:25

iOS实现水平方向瀑布流_IOS的相关文章

IOS实现自定义布局瀑布流_IOS

瀑布流是电商应用展示商品通常采用的一种方式,如图示例 瀑布流的实现方式,通常有以下几种 通过UITableView实现(不常用) 通过UIScrollView实现(工作量较大) 通过UICollectionView实现(通常采用的方式) 一.UICollectionView基础 1.UICollectionView与UITableView有很多相似的地方,如 都通过数据源提供数据 都通过代理执行相关的事件 都可以自定义cell,且涉及到cell的重用 都继承自UIScrollView,具有滚动效

详解IOS中如何实现瀑布流效果_IOS

首先是效果演示 特点:可以自由设置瀑布流的总列数(效果演示为2列) 虽然iphone手机的系统相册没有使用这种布局效果,瀑布流依然是一种很常见的布局方式!!!下面来详细介绍如何实现这种布局. 首先使用的类是UICollectionView 我们要做的是自定义UICollectionViewCell和UICollectionViewLayout      1.自定义UICollectionViewCell类,只需要一个UIImageView即可,frame占满整个cell.      2.重点是自

iOS瀑布流的简单实现(Swift)_IOS

这段时间突然想到一个很久之前用到的知识-瀑布流,本来想用一个简单的方法,发现自己走入了歧途,最终只能狠下心来重写UICollectionViewFlowLayout.下面我将用两种方法实现瀑布流,以及会介绍第一种实现的bug. <1>第一种 效果图如下所示: 这种实现方法的思路:  1)首先调用随机函数,产生随机高度,并把它保存到数组中 - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectio

iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流

上篇博客的实例是自带的UICollectionViewDelegateFlowLayout布局基础上来做的Demo, 详情请看<iOS开发之窥探UICollectionViewController(二) --详解CollectionView各种回调>.UICollectionView之所以强大,是因为其具有自定义功能,这一自定义就不得了啦,自由度非常大,定制的高,所以功能也是灰常强大的.本篇博客就不使用自带的流式布局了,我们要自定义一个瀑布流.自定义的瀑布流可以配置其参数: 每个Cell的边距

iOS开发之窥探UICollectionViewController(四) --一款功能强大的自定义瀑布流

在上一篇博客中<iOS开发之窥探UICollectionViewController(三) --使用UICollectionView自定义瀑布流>,自定义瀑布流的列数,Cell的外边距,Cell的最大以及最小高度是在我们的布局文件中是写死的,换句话说也就是不可配置的.为了循序渐进,由浅入深呢,上篇博客暂且那么写.不过那样写太过死板,本来使用起来比较灵活的自定义布局,如果把其配置参数给写死了,就相当于在笼中的猛兽,再厉害不也白扯蛮. 在今天这篇博客中我们要接着上篇博客中的Demo,使其自定义布局

在iOS上实现瀑布流界面

前阵子需要做一个需求,在iPhone上实现瀑布流效果. 第一眼看到这个需求,我想到的两种解决方案分别是: 1. 使用多个UITableView,然后控制它们同时滚动:  2. 使用一个UIScrollView,然后参考UITableView的实现自己做一个符合需求并且以后可以重用的控件. 我首先尝试了第一个方案,并且Google过控制多个UITableView同时滚动的代码,在StackOverflow里面找到一段蛮详细的代码了,不过在复杂的用户操作下,仍然会出现滚动不同步的情况. 最终,我放弃

读图年代:微博进行瀑布流的交互方式

"读图年代"将新浪微博与类似 Pinterest 瀑布流的交互方式相结合,让用户感觉到了不一样的阅读体验. 极客公园曾经探讨过Pinterest模式的流行是否意味着读图时代已经来到我们的面前,无可否认,读图已经成为一个热门话题,各种应用也是层出不穷.今天介绍的"读图年代"将类似 Pinterest 化的瀑布流阅读方式引进到新浪微博之中,使得用户可以轻松阅读微博海量信息,同时将各类信息集合并分类以方便用户浏览,以节省搜索的时间成本. "读图年代"的

Android瀑布流照片墙实现 体验不规则排列的美感_Android

传统界面的布局方式总是行列分明.坐落有序的,这种布局已是司空见惯,在不知不觉中大家都已经对它产生了审美疲劳.这个时候瀑布流布局的出现,就给人带来了耳目一新的感觉,这种布局虽然看上去貌似毫无规律,但是却有一种说不上来的美感,以至于涌现出了大批的网站和应用纷纷使用这种新颖的布局来设计界面. 记得我在之前已经写过一篇关于如何在Android上实现照片墙功能的文章了,但那个时候是使用的GridView来进行布局的,这种布局方式只适用于"墙"上的每张图片大小都相同的情况,如果图片的大小参差不齐,

利用JS实现简单的瀑布流效果

哈哈, 我又来啦, 在这一段时间里, 我简单的学习了一下javascript(JS), 虽然不是很懂啦, 但是我也简单的尝试着做了点小东西, 就比如现在流行的瀑布流效果, 经过我的努力终于成功的完成了, 虽然中间非常的坎坷, 并不是一帆风顺但是最终我还是实现了个简单的效果, 下面就为大家简单的介绍下, 不知道的友友们, 有兴趣的话, 可以来参考下, 欢迎指出缺点和不足! 一.瀑布流之准备工作    首先声明下, 为了方便演示和联系, 我使用的是本地图片, 如果大家有需要的话可以尝试着写下网络的,