iOS开发自定义流水布局
//集成UICollectionViewFlowLayout 自己写的布局
// SJBFlowLayout.m
// 自定义流水布局
//
// Created by zyyt on 16/7/20.
// Copyright © 2016年 sjb. All rights reserved.
//
#import "SJBFlowLayout.h"
/*******分割线*******分割线********分割线*******分割线 *********分割线*********分割线***********/
@implementation SJBFlowLayout
/**
//告诉布局对象去更像布局
Tells the layout object to update the current layout.
Layout updates occur the first time the collection view presents its content and whenever the layout is invalidated explicitly or implicitly because of a change to the view.
//在布局每一次更新的时候,collection都会唤醒这个方法
During each layout update, the collection view calls this method first to give your layout object a chance to prepare for the upcoming layout operation.
//这个方法默认什么也没实现 子类可以重写这个方法和用它去组建数据结构或实现任一个
The default implementation of this method does nothing. Subclasses can override it and use it to set up data structures or perform any initial computations needed to perform the layout later.
**/
- (void)prepareLayout
{
[super prepareLayout];
CGFloat inset = (self.collectionView.frame.size.width - self.itemSize.width) * 0.5;
/*
The distance that the content view is inset from the enclosing scroll view.
Use this property to add to the scrolling area around the content. The unit of size is points. The default value is UIEdgeInsetsZero.
*/
self.collectionView.contentInset = UIEdgeInsetsMake(0, inset, 0, inset);
}
/*Asks the layout object if the new bounds require a layout update.
The new bounds of the collection view.
Parameters
newBounds
The new bounds of the collection view.
Returns YES if the collection view requires a layout update or NO if the layout does not need to change.
*/
- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
return YES;
}
/*
Returns the layout attributes for all of the cells and views in the specified rectangle.
The rectangle (specified in the collection view’s coordinate system) containing the target views.
Parameters
rect
The rectangle (specified in the collection view’s coordinate system) containing the target views.
Returns An array of UICollectionViewLayoutAttributes objects representing the layout information for the cells and views.
*/
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect
{
NSArray * attArr = [super layoutAttributesForElementsInRect:rect];
/*
The collection view object currently using this layout object. (read-only)
The collection view object sets the value of this property when a new layout object is assigned to it.
*/
CGFloat centerX = self.collectionView.contentOffset.x + self.collectionView.frame.size.width * 0.5;
for (int i=0; i<attArr.count; i++) {
UICollectionViewLayoutAttributes * att = attArr[i];
CGFloat delta = ABS(att.center.x - centerX);
CGFloat scale = 1 - delta / self.collectionView.bounds.size.width;
att.transform = CGAffineTransformMakeScale(scale, scale);
}
return attArr;
}
/*
Returns the point at which to stop scrolling.
The proposed point (in the collection view’s content view) at which to stop scrolling. This is the value at which scrolling would naturally stop if no adjustments were made. The point reflects the upper-left corner of the visible content.
Parameters
proposedContentOffset
The proposed point (in the collection view’s content view) at which to stop scrolling. This is the value at which scrolling would naturally stop if no adjustments were made. The point reflects the upper-left corner of the visible content.
velocity
The current scrolling velocity along both the horizontal and vertical axes. This value is measured in points per second.
Returns The content offset that you want to use instead.
*/
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity
{
CGRect rect;
rect.origin.y = 0;
rect.origin.x = proposedContentOffset.x;
rect.size.width = self.collectionView.bounds.size.width;
rect.size.height = self.collectionView.bounds.size.height;
NSArray * attArr = [super layoutAttributesForElementsInRect:rect];
//The point at which the origin of the content view is offset from the origin of the scroll view.
CGFloat centerX = self.collectionView.contentOffset.x + self.collectionView.frame.size.width * 0.5;
CGFloat mindel = MAXFLOAT;
for (int i= 0; i<attArr.count; i++) {
UICollectionViewLayoutAttributes * attributes = attArr[i];
if ( ABS(mindel) > ABS(attributes.center.x - centerX)) {
mindel = attributes.center.x - centerX;
}
}
CGPoint point = CGPointMake(proposedContentOffset.x + mindel, 0);
return point ;
}
@end
/*******分割线*******分割线********分割线*******分割线 *********分割线*********分割线***********/
// ViewController.m
// 自定义流水布局
//
// Created by zyyt on 16/7/20.
// Copyright © 2016年 sjb. All rights reserved.
//
#import "ViewController.h"
#import "SJBFlowLayout.h"
#import "SJBCollectionCell.h"
#import "AFNetworking.h"
@interface ViewController ()<UICollectionViewDataSource>
@property (nonatomic,strong)NSMutableArray * dataSouce;
@property (nonatomic,strong)UICollectionView * collectionView;
@end
/*******分割线*******分割线********分割线*******分割线 *********分割线*********分割线***********/
static NSString * const cellID = @"cell";
@implementation ViewController
- (NSMutableArray *)dataSouce
{
if (_dataSouce == nil) {
_dataSouce = [NSMutableArray array];
}
return _dataSouce;
}
- (void)viewDidLoad {
[super viewDidLoad];
SJBFlowLayout * layout = [[SJBFlowLayout alloc] init];
layout.itemSize = CGSizeMake(100, 100);
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
self.collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 150, [UIScreen mainScreen].bounds.size.width, 200) collectionViewLayout:layout];
self.collectionView.dataSource = self;
[self.collectionView registerNib:[UINib nibWithNibName:NSStringFromClass([SJBCollectionCell class]) bundle:nil] forCellWithReuseIdentifier:cellID];
[self.view addSubview:self.collectionView];
[self requestData];
}
- (void)requestData
{
NSMutableDictionary * params = [NSMutableDictionary dictionary];
params[@"a"] =@"list";
params[@"c"] = @"data";
params[@"type"] = @(10);
params[@"page"] = @(0);
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
[manager GET:@"http://api.budejie.com/api/api_open.php" parameters:params success:^(NSURLSessionDataTask * _Nonnull task, id _Nonnull responseObject) {
NSLog(@"%@",responseObject);
for (int i=0; i<[responseObject[@"list"] count]; i++) {
[ self.dataSouce addObject:responseObject[@"list"][i]];
}
[self.collectionView reloadData];
} failure:^(NSURLSessionDataTask * _Nonnull task, NSError * _Nonnull error) {
}];
}
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
return 1;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return self.dataSouce.count;
}
- (UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
SJBCollectionCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
cell.modelDic = [self.dataSouce objectAtIndex:indexPath.item];
cell.contentView.backgroundColor = [UIColor whiteColor];
return cell;
}
@end
/*******分割线*******分割线********分割线*******分割线 *********分割线*********分割线***********/
#import "SJBCollectionCell.h"
#import "UIImageView+WebCache.h"
#import "UIImage+Circal.h"
@interface SJBCollectionCell ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end
@implementation SJBCollectionCell
- (void)awakeFromNib {
// Initialization code
}
- (void)setModelDic:(NSDictionary *)modelDic
{
_modelDic = modelDic;
NSLog(@"%@",modelDic);
[self.imageView sd_setImageWithURL:[NSURL URLWithString:[modelDic objectForKey:@"image1"]] completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {
self.imageView.image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
} ];
self.imageView.contentMode = UIViewContentModeScaleAspectFill;
}
@end
iOS开发自定义流水布局的更多相关文章
- IOS开发之绝对布局和相对布局(屏幕适配)
之前如果做过Web前端页面的小伙伴们,看到绝对定位和相对定位并不陌生,并且使用起来也挺方便.在IOS的UI设计中也有绝对定位和相对定位,和我们的web前端的绝对定位和相对定位有所不同但又有相似之处.下 ...
- swift - uicollectionView自定义流水布局
TYWaterFallLayout 不规则流水布局 - swift3.0 配图 使用方法 //创建layout let layout = TYWaterFallLayout() layout.sect ...
- iOS开发自定义字体之静态字体
最后更新 2017-04-25 在iOS开发中经常会用到字体, 一般字体文件比较小的,单一的,几十k, 可以通过内置进去;如果字体文件比较多或者字体文件比较大,通常通过动态加载方式. 静态加载方式 将 ...
- iOS开发之蜂窝布局—Swift
前言 最近项目中用到了类似蜂窝的六边形布局,在这里分享出来抛砖引玉,供大家参考学习.本文提供了2种思路实现效果,第一种方式使用UICollectionView实现,第二种方式使用UIScrollVie ...
- iOS 开发自定义一个提示框
在开发的时候,会碰到很多需要提示的地方,提示的方法也有很多种,ios 8 以前的版本有alertview还是以后用的alertController,都是这种作用, 但是不够灵活,而且用的多了,用户体验 ...
- [IOS 开发] 自定义(重写) UITableViewCell的高亮背景色
IOS的sdk中,对UITableViewCell的高亮背景色只支持两种颜色,分别为UITableViewCellSelectionStyleBlue和UITableViewCellSelection ...
- iOS开发~UI布局(三)深入理解autolayout
一.概要 通过对iOS8界面布局的学习和总结,发现autolayout才是主角,autolayout是iOS6引入的新特性,当时还粗浅的学习了下,可是没有真正应用到项目中.随着iOS设备尺寸逐渐碎片化 ...
- iOS开发~UI布局(二)storyboard中autolayout和size class的使用详解
一.概要:前一篇初步的描述了size class的概念,那么实际中如何使用呢,下面两个问题是我们一定会遇到的: 1.Xcode6中增加了size class,在storyboard中如何使用? 2.a ...
- iOS开发~UI布局(一)初探Size Class
随着iOS8系统的发布,一个全新的页面UI布局概念出现,这个新特性将颠覆包括iOS7及之前版本的UI布局方式,这个新特性就是Size Class.Size Class配合Auto Layout可以解决 ...
随机推荐
- Javascript使用postMessage对iframe跨域通信
今天才发现原来有这么个好东西啊,跨域通信太方便了, 举个小栗子: 共两个页面, 页面1:www.a.com/a.html 页面2:www.b.com/b.html 实现目标:两个网站页面实现跨域相互通 ...
- SASS使用CSS3动画并使动画暂停和停止在最后一帧的简单例子
今天在手机上试了试这个 css3 动画效果,可以把动画效果停留在最后一帧上,以及鼠标 :hover 暂停动画,比较实用的功能,不用 JS 也能实现这些效果了. 不过测试体验感觉手机上没有 jQuery ...
- suse linux11 包括所有的linux操作系统的 遗忘root密码解决方案
2017-1-13号,用户要割接ocs系统应用,因为不能直接给root密码,但是操作过程中出现密码修改出错,再次登录系统仍然有问题.去机房熬了将近6个小时,试过单用户模式(但需要密码),试过光盘救援模 ...
- [HMLY]10.iOS中block的基础用法
本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等.用过GCD就知道 ...
- eclipse里xml提示包名的插件——Rinzo
1.Rinzo简介 在官方网站上的介绍到,Rinzo是一款Eclipse的XML编辑器,可以使在处理XML文件时变得简洁高效.与一般的XML文件相比,具有以下特点: l 自动显示DTD或Schema里 ...
- ubuntu16.04 samba 配置
samba是一个很有用的在Linux和Windows之间共享文件的服务器程序,在工作的时候一直在使用,不过都是别人配置好的环境,自已一直没有配置过Samba服务器,今天尝试着自己配置的一次遇到了很多的 ...
- 查增删改MySQL数据库固定模式
省略相关包的导入... public class Base { public static Connection connection = null; public static PreparedSt ...
- Trie - leetcode [字典树/前缀树]
208. Implement Trie (Prefix Tree) 字母的字典树每个节点要定义一个大小为26的子节点指针数组,然后用一个标志符用来记录到当前位置为止是否为一个词,初始化的时候讲26个子 ...
- Front-End(一)
前端初识 现在网站开发的市场越来越大,个人和企业都有了主页.网络办公的需求,并且随着网站开发前端和后台的工作细分,前端开发的需求也越来越大. 前端的任务是将美工的网页设计使用前端技术尽可能无差别地实现 ...
- NullSafe 的原理
摘要 NullSafe is a simple category on NSNull that returns nil for unrecognised messages instead of thr ...