iOS實(shí)現(xiàn)水平方向瀑布流
效果

源碼: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];
// 獲取數(shù)據(jù)
[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
細(xì)節(jié)
繼承UICollectionViewLayout

重載UICollectionViewLayout的四個(gè)方法

部分實(shí)現(xiàn)細(xì)節(jié)


以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- iOS瀑布流的簡(jiǎn)單實(shí)現(xiàn)(Swift)
- 詳解IOS中如何實(shí)現(xiàn)瀑布流效果
- IOS簡(jiǎn)單實(shí)現(xiàn)瀑布流UICollectionView
- IOS實(shí)現(xiàn)自定義布局瀑布流
- Jquery瀑布流插件使用介紹
- js實(shí)現(xiàn)的美女瀑布流效果代碼
- javascript自適應(yīng)寬度的瀑布流實(shí)現(xiàn)思路
- jQuery 瀑布流 浮動(dòng)布局(一)(延遲AJAX加載圖片)
- 瀑布流布局并自動(dòng)加載實(shí)現(xiàn)代碼
- iOS自定義UICollectionViewLayout實(shí)現(xiàn)瀑布流布局
相關(guān)文章
iOS開(kāi)發(fā)仿電商類(lèi)APP首頁(yè)實(shí)例
本篇文章主要介紹了iOS開(kāi)發(fā)仿電商類(lèi)APP首頁(yè)實(shí)例,主要是利用ui布局,具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11
iOS利用CoreImage實(shí)現(xiàn)人臉識(shí)別詳解
OS的人臉識(shí)別從iOS 5(2011)就有了,不過(guò)一直沒(méi)怎么被關(guān)注過(guò)。人臉識(shí)別API允許開(kāi)發(fā)者不僅可以檢測(cè)人臉,也可以檢測(cè)到面部的一些特殊屬性,比如說(shuō)微笑或眨眼。下面這篇文章主要給大家介紹了iOS利用CoreImage實(shí)現(xiàn)人臉識(shí)別的相關(guān)資料,需要的朋友可以參考下。2017-05-05
iOS NSCache和NSUrlCache緩存類(lèi)實(shí)現(xiàn)示例詳解
這篇文章主要為大家介紹了iOS NSCache和NSUrlCache緩存類(lèi)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
iOS開(kāi)發(fā)之UITableView左滑刪除等自定義功能
今天來(lái)給大家介紹下iOS開(kāi)發(fā)中UITableView左滑實(shí)現(xiàn)微信中置頂,刪除等功能。對(duì)大家開(kāi)發(fā)iOS具有一定的參考借鑒價(jià)值,有需要的朋友們一起來(lái)看看吧。2016-09-09
IOS 下獲取 rootviewcontroller 的版本不同的問(wèn)題解決辦法
這篇文章主要介紹了IOS 下獲取 rootviewcontroller 的版本不同的問(wèn)題解決辦法的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家遇到這種問(wèn)題可以解決,需要的朋友可以參考下2017-10-10
使用Xcode為iOS應(yīng)用項(xiàng)目創(chuàng)建PCH文件的方法及應(yīng)用示例
這篇文章主要介紹了使用Xcode為iOS應(yīng)用項(xiàng)目創(chuàng)建PCH文件的方法及應(yīng)用示例,PCH文件可以保留應(yīng)用的很多的基礎(chǔ)設(shè)置信息以供復(fù)用,需要的朋友可以參考下2016-03-03
詳解iOS游戲開(kāi)發(fā)中Cocos2D的坐標(biāo)位置關(guān)系
這篇文章主要介紹了iOS游戲開(kāi)發(fā)中Cocos2D的坐標(biāo)位置關(guān)系,Cocos2D是專(zhuān)門(mén)用來(lái)開(kāi)發(fā)iOS游戲的開(kāi)源框架,文中示例代碼采用Objective-C語(yǔ)言,需要的朋友可以參考下2016-02-02
IOS開(kāi)發(fā)之由身份證號(hào)碼提取性別的實(shí)現(xiàn)代碼
這篇文章主要介紹了IOS開(kāi)發(fā)之由身份證號(hào)碼提取性別的實(shí)現(xiàn)代碼的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07

