iOS轮播图封装

ECAutoScrollBanner

轮播图封装。能够兑现全自动定时翻页、手动翻页;垂直和水准滚动等。协理纯文本、本地图片、互联网图片以及其余view试图。

引文:

bug fix:

  1. 创办view试图类的轮播图优化修复。(注意:view视图类的轮播中,view的坐标是相对于cell.contentView的坐标,是contentView的子视图)

肖像浏览滑动效果UIScrollView和UIPageControl组合
tada

Github:https://github.com/EchoZuo/ECAutoScrollBanner

运用UIScrollView 结合 UIImageView
完毕图片循环滚动
 —
七个和三个ImgView哪个性能更好?

Navigation 导航

UIScrollView新手教程 
—  不错

Abstract 概要

理解Scroll
View
 
— 光栅化和烧结,原理好文

简介&特性

电脑图形渲染的流程 
—  知识展开,很浅显

轮播图封装,网上有诸多现成的demo,也没怎么难度。这么些是很早在此以前写过的轮播图封装,这一次正好须求就重新整理一下发出来,希望能支持到要求的人。

  • 支撑手动翻页、自动定时翻页
  • 支撑垂直和水准滚动
  • 接济地点图片、互连网图片、纯文本以及其余View视图,如图文混合排版的视图等。
  • 支撑设置浮现和隐藏pageControl和自定义pageControl的frame
  • 可以做简便修改,将需要的一定属性开放利用

制图像素到显示器上 
—  底层绘图

效果图

image

ScrollView 与
Autolayout
 
—  一个坑,应该先加八个contentView

Explain 说明

UIScrollView
实践经验
 
—  好好了解

贯彻格局

UIScrollView

先是正好说一下 frame 和 bounds的区分:

轮播图基本达成思路有如下两种,本次封装使用的是首先种方法,用UICollectionView完结。
  1. 基于UICollectionView的卷入(推荐应用)
    1. 布帆无恙便民,使用方便,并且达成代码也不复杂;
    2. 大气加载和滚动或许机关轮播的时候基本不须求考虑录用质量等题材
  2. 用UIScrollView+UIImageView的措施贯彻A
    1. 用户看到的是多少个UIImageView的落成方式;
    2. 万一数量太多,要求考虑到选定等属性难题;
    3. 只要底层是UITableView并且轮播图是用作cell的话,更亟待考虑到tableView嵌套scrollView的滚动品质难题。
  3. 用UIScrollView+UIImageView的不二法门贯彻B
    1. 只要求创立二个UIImageView,不须求考虑录用难点;
    2. 与第两种差其他即使用户永远看到的是当中那一个UIImageView,只是上边的始末再持续变化,其中间贯彻其实是在不停的变更十一分轮播数组。
  4. 唯有三个UIImageView
    1. 那种达成格局不再基于ScrollView,同样不存在重用等的题目。那种已毕形式跟第一种有相似之处,不过它跟第3种的区分是不再利用scrollView的图样切换形式。依旧不停地去改变这么些数组的内容。这种落成形式的基本在于切换的时候使用自定义的layer层的转场动画。模拟scrollView的滑动效果。

contentOffset

精美绝伦的经过转移scrollView的bounds,每一个独立的子视图都被移动了。那正是二个scrollView的做事原理。当设置contentOffset时,它改变scrollView.bounds.origin。(子视图的frame是争辨于父视图bounds的布局)

本次封装完结思路
  • 底层接纳UICollectionView当控制器。给原数据源下标0位添加原数据源末尾数据,给元数据源下标末尾添加原数量源0位的数量。以此形成3个新的数据源。可以参考下图
image

支撑手动翻页和定时翻页
  • 手动翻页没什么可说的。自动翻页其实就是一个粗略的定时器(用NSTimer和GCD都ok)完成定时调用对应的翻页方法即可。

contentSize

contentSize > bounds,可以滚动视图

支撑竖向垂直翻页和程度翻页
typedef NS_ENUM(NSInteger, ECAutoScrollBannerScrollDirection){
    ECAutoScrollBannerScrollDirectionVertical       = 1,    // 竖向滚动
    ECAutoScrollBannerScrollDirectionHorizontal     = 0,    // 横向滚动
};

图片 1

详见介绍

盛开的部分设置属性(代码中注释都很详细,也可以平昔翻看源码即可)
/**
 * delegate,非必
 */
@property (nonatomic, weak) id<ECAutoScrollBannerDelegate> delegate;

/**
 * 是否自动翻页,默认NO,非必
 */
@property (nonatomic, assign) BOOL isAutoPaging;

/**
 * 是否展示PageControl,默认YES,非必
 */
@property (nonatomic, assign) BOOL isHavePageControl;

/**
 * 是否无限循环,默认NO,非必
 */
@property (nonatomic, assign) BOOL isInfinitePaging;

/**
 * 自动翻页的时候知否支持手动滑动,必须在isAutoPaging=YES时候设置才有效果,if isAutoPaging=YES,则这个必须设置
 */
@property (nonatomic, assign) BOOL isEnabledPanGestureRecognizer;

/**
 * collectionView backgroundColor,默认lightGrayColor,非必
 */
@property (nonatomic, strong) UIColor *collectionViewBgColor;

/**
 * 可以自定义pageControl的frame(相对于self),必须isHavePageControl=YES,如果没有设置新坐标,则取默认坐标,非必
 */
@property (nonatomic, assign) CGRect pageControlFrame;

/**
 * 自动翻页间隔时间。需isAutoPaging=YES才需要设置,否则设置什么效果。默认3.0f
 */
@property (nonatomic, assign) CGFloat  autoPageInterval;

contentOffset就相同bounds.origin

要害的一对盘算
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (self.isAutoPaging) {
        scrollView.panGestureRecognizer.enabled = self.isEnabledPanGestureRecognizer;
    }

    NSInteger page = 0;

    // 是否无限循环
    if (!self.isInfinitePaging) {
        if (self.bannerScrollDirection == ECAutoScrollBannerScrollDirectionHorizontal) {
            page = scrollView.contentOffset.x / scrollView.frame.size.width;
        } else {
            page = scrollView.contentOffset.y / scrollView.frame.size.height;
        }
        self.pageControl.currentPage = page;
    } else {
        if (self.bannerScrollDirection == ECAutoScrollBannerScrollDirectionHorizontal) {
            page = scrollView.contentOffset.x / scrollView.frame.size.width;

            // 第一张
            if ((page == 0) && (scrollView.contentOffset.x <= 30)) {
                page = self.mainDataSource.count - 2;

                NSIndexPath *indexPath = [NSIndexPath indexPathForItem:page inSection:0];
                [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
            } else if ((page == self.mainDataSource.count - 1) && (scrollView.contentOffset.x >= scrollView.contentSize.width - scrollView.frame.size.width - 30)) {
                // 最后一张
                page = 0 + 1;
                NSIndexPath *indexPath = [NSIndexPath indexPathForItem:page inSection:0];
                [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
            }
        } else {
            page = scrollView.contentOffset.y / scrollView.frame.size.height;

            // 第一张
            if ((page == 0) && (scrollView.contentOffset.y <= 30)) {
                page = self.mainDataSource.count - 2;

                NSIndexPath *indexPath = [NSIndexPath indexPathForItem:page inSection:0];
                [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
            } else if ((page == self.mainDataSource.count - 1) && (scrollView.contentOffset.y >= scrollView.contentSize.height - scrollView.frame.size.height - 30)) {
                // 最后一张
                page = 0 + 1;
                NSIndexPath *indexPath = [NSIndexPath indexPathForItem:page inSection:0];
                [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
            }
        }
        self.pageControl.currentPage = page - 1;
    }
}

Usage 使用

contentInsets

contentInset属性可以改变contentOffset的最大值和微小值,那样便可以滚动出可滚动的区域。新手小例子中用contentInsets来控制压缩的图形居中。

UITableView 刷新原理

tableView为了适应每种cell,可滚动区域是通过密切估计的。当您滚动经过tableView的第2个或最终一个cell边界时,tableView将contentOffset弹回并复位,所以cells又一回紧贴scrollView的bounds。所以,必须将�refresh
control放在可滚动区域的上面。那将同意首先contentOffset弹回第叁行。

当向下拉动出充裕多的区域时,tableView设置contentInsets,扩充了contentOffset的区域,refreshControl的区域就被含有进来。刷新落成后,contentInsets恢复生机原始值,contentOffset也上涨。(EGOTableViewPullRefresh完结)

小应用

当键盘现身在界面上的时候,挡住了scrollView原本展现的一有的。通过安装contentInsets.bottom

键盘的惊人,可以目前扩充contentOffset的向下最大可视范围,从而能拖动看到被键盘挡住的那部分。键盘消失时,再过来contentInsets。

使用方法

  1. 将ECAutoScrollBanner文件夹直接拖入项目中,导入头文件#import
    “ECAutoScrollBanner.h”
  2. CocoaPods:pod ‘ECAutoScrollBanner’

ScrollView && AutoLayout 

对此 UIScrollView 的 subview 来说,它的 leading/trailing/top/bottom
space 是相对于 UIScrollView 的 contentSize 而不是 bounds
来鲜明的,所以当您尝试用 UIScrollView 和它 subview 的
leading/trailing/top/bottom 来相互决定大小的时候,就会现出              
   「Has ambiguous scrollable content width/height」的 warning。

是的的架势是用 UIScrollView 外部的 view 或 UIScrollView 自己的
width/height 明确 subview 的尺寸,进而鲜明 contentSize。

因为 UIScrollView 本人的 leading/trailing/top/bottom
变得不好用,所以本身习惯的做法是在 UIScrollView 和它原先的 subviews
之间增添二个 content view

利用示例

delegate调用顺序

scrollViewDidScroll:  —  在其它格局触发 contentOffset
变化的时候都会被调用

scrollViewWillBeginDragging:  —  dragging noDecelerating

scrollViewWillEndDragging: withVelocity: targetContentOffset:  — 
dragging noDecelerating

scrollViewDidEndDragging: willDecelerate:  —  dragging
noDecelerating

scrollViewWillBeginDecelerating:  —  dragging decelerating

scrollViewDidEndDecelerating:  —  noDragging noDecelerating

实则使用起来很便捷很简单。只要求初步化,然后设置相关属性即可。协理先暗中认同发轫化,在必要的时候设置其样式和翻页效果翻页时间等。

分页优化

pagingEnabled

缺陷蛮多,具体padding还不懂

Snap

说到底没到位,动画会突然到位,是突然

targetContentOffset

更平整,在此之前总括好,动画自然

纯文本滚动条,适用于广告、音讯资讯等

- (ECAutoScrollBanner *)textBannerView {
    if (_textBannerView == nil) {
        _textBannerView = [ECAutoScrollBanner initTextBannerWithFrame:self.topView.bounds withTextDataSource:self.textDataArray withBannerScrollDirection:ECAutoScrollBannerScrollDirectionVertical];
        _textBannerView.delegate = self;
        _textBannerView.isAutoPaging = YES;
        _textBannerView.isHavePageControl = NO;
        _textBannerView.isInfinitePaging = YES;
        _textBannerView.isEnabledPanGestureRecognizer = NO;
        _textBannerView.autoPageInterval = 4.0f;
    }
    return _textBannerView;
}

视觉差

因此 scrollViewDidScroll
实时改变另3个scrollView的contentOffSet,和新手教程里的法则类似。

如若急需点击跳转等,完毕协议和商事章程即可,下同。
- (void)tapScrollBannerItem:(NSInteger)itemTag withObject:(id)object {
    NSLog(@"文本banner。点击了第%ld个子item,下标%ld", (long)itemTag + 1, (long)itemTag);
}

重用

保安三个起用队列

当成分离开可知范围时,removeFromSuperview 并参与重用队列(enqueue)

当须要插足新的因素时,先品尝从录取队列获取可拔取成分(dequeue)并且从录取队列移除

若果队列为空,新建成分

那么些相似都在 scrollViewDidScroll: 方法中成功

手动翻页的图样banner,本地图片

- (ECAutoScrollBanner *)imageBannerView {
    if (_imageBannerView == nil) {
        _imageBannerView = [ECAutoScrollBanner initLocalImageBannerWithFrame:CGRectMake(0, 30, self.bottomView.frame.size.width, 180) withImageDataSource:self.imageDataArray withBannerScrollDirection:ECAutoScrollBannerScrollDirectionHorizontal];
        _imageBannerView.isAutoPaging = NO;
    }
    return _imageBannerView;
}

note that:

当重用对象为 view controller 时,记得 addChildViewController

当 view 或 view controller 被收录但其对应 model
暴发变化的时候,须求马上清理重用前留下的始末

数量可以适度做缓存,在录取的时候尝试从缓存中读取数据甚至从前的情形(如
table view 的 contentOffset),以博取更好的用户体验

当 on screen 的因素数量可鲜明的时候,有时候可以提前 init
这个要素,不会在 scroll 进度中碰着因为 init 费用带来的卡顿(尤其是以
view controller 为重用对象的时候)


引文:

IOS之触摸事件和手势

触摸事件: 

touchesBegan:withEvent:

touchesMoved:withEvent:

touchesEnded:withEvent:

touchesCancelled:with伊芙nt:  —  电话导入裁撤

(1) 单tap下,touches == event.allTouches。 两指,event.allTouches.count
== 2;

(2) 连tap两下,touches -> touch -> tapCount == 2  —
想到很多连击游戏,假如得以MS到点子里把tapCnt改个100。

图片 2

由此落到实处二个TableView来领会iOS
UI编程

(1)UIView中:

initWithFrame:–  初始化

layoutSubviews  —  布局 (setNeedsLayout)

CGGeometry.h — CGRectGetMaxX

(2)首先将编译选项改为 OC++。

如若头文件中用 @class
声可瑞康(Karicare)个类,那么这几个类中的对象在被外面访问的时候就会现出 Member access
into incomplete type “~~”`

(3)子类化UIScrollView达成对Cell的布局  —  中度和Y值举行布局

(4)Cell的录取  —  visibleCells(删除入队) 和 cacheCells(获取出队)

和VC重用思路类似。

在要动用3个Cell的时候大家先去探访tableView中有没有能够引用的cell,假使有就用这么些可以采取的cell,只有在未曾的时候才去创制3个Cell。那就是享元格局

享元情势可以领略成,当细粒度的对象数量越多的时候运转的代价会一定大,此时使用共享的技能来大大降低运转开销。比较特出的显现就是内容使得的压制内存抖动的情形时有暴发,还有控制内存增进。它的英文名字是flyweight,让重量飞起来。

(5)响应和处负责人件  —  addGesture (点击地点与cellFrame)

(6)接口和数目得到  —  protocol (数据源,点击事件)

(7)选中态  —  事件措施判断,backgroundView显示


UITableView
滚动流程性优化
 
—  O(1)

详见整理:UITableView优化技巧  — 
用到很多素不相识的情势

UITableView质量优化-三次面试后的自省总计

晋级UITableView质量-复杂页面的优化  —
 类似

UIScrollView
实践经验
— 
好棒多少个例证,最佳技巧UITableView

何以加强 iOS
里的列表滚动时的顺畅感?

 很多

iOS
保持界面流畅的技术
  —
 ibib

四回 TableView 品质优化经历

10个加速Table Views开发的Tips

阿峥教你兑现UITableView循环利用

VVeboTableViewDemo

自行翻页的图形banner,url图片

- (ECAutoScrollBanner *)urlImageBannerVeiw {
    if (_urlImageBannerVeiw == nil) {
        UIImageView *placehodelImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 50 + 50 + 10 + 180 + 10, self.view.frame.size.width, 180)];
        placehodelImage.backgroundColor = [UIColor lightGrayColor];
        _urlImageBannerVeiw = [ECAutoScrollBanner initOnlineImageBannerWithFrame:CGRectMake(0, 50 + 50 + 10 + 180 + 10, self.view.frame.size.width, 180) withImageUrlDataSource:self.imageUrlDataArray withPlaceholderImage:placehodelImage.image withBannerScrollDirection:ECAutoScrollBannerScrollDirectionHorizontal];
        _urlImageBannerVeiw.isAutoPaging = YES;
        _urlImageBannerVeiw.isEnabledPanGestureRecognizer = YES;
        _urlImageBannerVeiw.isInfinitePaging = YES;
    }
    return _urlImageBannerVeiw;
}

UITableView

1. 高速滑动

当用户手动拖动tableView时,加载cell图片。

当用户飞快滑动的减速进度中, 有缓存就加载,没缓存不加载cell图片。

targetContentOffset地方一向设置加载,滚动到的时候已经开始加载。

2. LazyLoad

– fetchDataFromServer  – AFHTTPRequestOperationManager

– heightForRowAtIndexPath

– setupCell: withIndexPath:  —  SDWebImageDownloader

– loadImageForVisibleCells

– scrollViewDelegate – 3

3. Cell录用机制

[tableView dequeueReusableCellWithIdentifier:(NSString)identifier
 forIndexPath:(NSIndexPath
)indexPath];

(1) Storyboard: 定义Cell的Prototype,并设置其Reusable Identifier

(2) Xib自定义: [registerNib:(nullable UINib)nib
forCellReuseIdentifier:(NSString
)identifier];

(3) 代码自定义:[registerClass:(nullable Class)cellClass
forCellReuseIdentifier:(NSString *)identifier];

重写自定义cell的 initWithStyle:withReuseableCellIdentifier:
方法开展布局。

自定义cell时,记得将其余情节加到self.contentView 上,而不是平昔抬高到
cell 本身上。

4. 设计统一标准的Cell

–  等高的Cell好设计

–  动态统计中度的Cell也应当联合布署

5. 超前统计并缓存cell的UI尺寸消息

成立ViewModel,计算并储存Cell的UI尺寸音信

tableView:heightForRowAtIndexPath: –>
tableView:cellForRowAtIndexPath

使用了ViewModel来保存UI信息,Cell 惊人的计算 和 利用的时机 急需专门在意。

6. 圆角,阴影,mask

(1) Cell中的view尽或者不要使用透明 —
opaque不透明的话,绘画的时候就不会去画下层的视图。尽量减弱cell中子视图透明化以及做切圆操作,在layer层渲染图层时会涉及上下文切换以及离屏渲染之类的,系统花费会很大,尤其是在cell视图很复杂的时候,由于渲染难点导致的内存成本会让您的tableview万分卡顿。比如cell中要求安装头像圆形直接设置圆角会很卡,一般用CG把获得的图样处理三遍在给cell使用就好了。圆角、阴影之类的漫天
bitmap 化,或许放到后台 draw 好了再拿来用

(2) 用代码自定义的cell,使用时要做 layer 栅格化处理

(3) 减弱子视图的层级关系

(4) 图片载入在后台进程展开,滚出可视范围的载入进程cancel掉

(5) 后台对图纸先举办解码

UIImageView
载入是惰性的传教,是对的。不过超过一半开发者都未曾正确领会那点。上面就详细解释一下:

[UIImage imageWithContentOfFile:] 出来的 UIImage
其实并没有当真把公文解码到内存,而是要等到用的时候(例如去显得恐怕去
scale)才会去做那件工作。但难点就在于 UIImageView 试图去 draw
图片的时候,它读文件、渲染也是在主线程里做的,所以您要读入的图样如果很大(比如
三星平板3 上的 @2x
图),这一步就很简单会卡一下。那约等于干吗自个儿说图片要放置后台进度去解码完今后,在主线程展现。


iOS中线宽与像素的关联  —
 补补补

手动翻页的view视图轮播

UITableViewCell

1.
UITableViewCell的推断机制与中度计算

iOS7 

estimatedRowHeight, SectionHeaderHeight, SectionFooterHeight            
        iOS7中逐个cell的可观会被系统自动缓存起来,不会再重复总计了

[cell.contentView
systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
可以透过自律计算到cell的惊人。必要使用者对约束设置的正如自如,要保证
contentView
内部前后左右兼有矛头都有约束支撑,设置不客观的话总结的万丈就成了0。

其它索要专注的是, 在iOS7下, 就算布局中有UILabel, 并且行数大于0时,
必要钦命preferred马克斯LayoutWidth, 那样Label才能明白本人怎么时候该换行,
然后-systemLayoutSizeFittingSize才能博得不错的中度.

另一种方案就是,给cell的contentView添加1个和tableView宽度相同的小幅约束,
这样就能在UILabel约束完备的情事下算出UILabel的宽度.(因为contentView宽度的计量须要知道子控件宽度的拉长,而UILabel的换行却凭借着contentView的宽窄,不换行就不知道UILabel的冲天!)

iOS8

self-sizing cell

2. 制作五个得以滑动操作的 Table View
Cell

成立3个自定义 Cell

— button1  button2 点击传递给delegate去处理  — 充裕1个 Delegate

— contentView 用于覆盖,Label用于突显

为按钮添加 Action

showDetailWithText: — presentDetailNav

加上顶层视图并添加滑动 Action

增加数量 — labelText由cell.label托管

手势识别

— panRecognizer – panThisCell:

— panStartPoint 开端点,判断左右滑动

— startingRightLayoutConstraintConstant 右约束

— contentViewLeftConstraint & contentViewRightConstraint

移动那么些约束

buttonTotalWidth

– (void)resetConstraintContstantsToZero:(BOOL)animated
notifyDelegateDidClose:(BOOL)endEditing

– (void)setConstraintsToShowAllButtons:(BOOL)animated
notifyDelegateDidOpen:(BOOL)notifyDelegate

UIGestureRecognizerStateBegan & UIGestureRecognizerStateChanged

Snap!

– (void)updateConstraintsIfNeeded:(BOOL)animated
completion:(void(^)(BOOL finished))completion

set & reset

UIGestureRecognizerStateEnded & UIGestureRecognizerStateCancelled

更好地拍卖 Table View

Gesture冲突 — shouldRecognizeSimultaneouslyWithGestureRecognizer:

录取cell出现打开 — prepareForReuse

– (void)cellDidOpen:(UITableViewCell *)cell;

– (void)cellDidClose:(UITableViewCell *)cell;

– (void)openCell;

set & reset + delegate方法

cellsCurrently艾德iting —
打开添加关闭移除没难点,打开cell状态滑动tableView,会进行录取会调用cellForRowAtIndexPath,所以检测是或不是包蕴在currentlyEditing数组中,即使在就

3. 很炫的table view cell切换效果 
SvpplyTable

看来简单函数内部又调用复杂函数,今后好不不难想精通了,是为了对外提供简介的API,然后复杂的逻辑在大团结之中做。小编随后也要如此干。

比方反复跳转调用函数,传递参数名尽量不要变,不然会给阅读扩充负担。

_ivar 比 self.ivar 的一个益处在于调试时候可以更易于见到值

4.利用长按手势移动 Table View
Cells
 
—  小而美


(注意:view视图类的轮播中,view的坐标是相对于cell.contentView的坐标,是contentView的子视图)
- (ECAutoScrollBanner *)viewBannerView {
    if (_viewBannerView == nil) {
        _viewBannerView = [[ECAutoScrollBanner alloc] initViewBannerWithFrame:CGRectMake(0, 20 + 180 + 20 + 180 + 20, self.view.frame.size.width, 180) withViewsDataSouce:self.viewDataArray withBannerScrollDirection:ECAutoScrollBannerScrollDirectionHorizontal];
        _viewBannerView.isAutoPaging = NO;
    }
    return _viewBannerView;
}

UICollectionView

UICollectionView Tutorial Part 1: Getting
Started

UICollectionView Tutorial Part 2: Reusable Views and Cell
Selection

将来,UICollectionViews有了简约的重排功效 
— 太棒

叶孤城:UICollectionView自定义布局教程——Pinterest

UICollectionView
高级进阶篇
 
— 各类酷炫

自定义 Collection View
布局
  —
 中规中矩

UICollectionView Custom Layout Tutorial: A Spinning
Wheel
 
—  旋转视图, 改变锚点, 自定义 collection view layout

Vertical  —  from left to right,horizontal  —  from top to bottom

Supplementary viewsdecoration views
必须是UICollectionReusableView的子类。

header && footer

UICollectionViewController,UICollectionView,UICollectionViewCell,UICollectionReuseableView,UICollectionViewLayout,UICollectionViewLayoutAttributes

– (void)prepareLayout  —
 那么些整个布局进程中最关键的不二法门之一。因为此处可以成立和存储layout
attributes。

– (CGSize)collectionViewContentSize

– (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect


(UICollectionViewLayoutAttributes*)layoutAttributesForItemAtIndexPath:(NSIndexPath*)indexPath


(CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset
withScrollingVelocity:(CGPoint)velocity

– (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds

动画:

插入和删除

initialLayoutAttributesForAppearingItemAtIndexPath:

initialLayoutAttributesForAppearingSupplementaryElementOfKind:atIndexPath:

initialLayoutAttributesForAppearingDecorationElementOfKind:atIndexPath:

finalLayoutAttributesForDisappearingItemAtIndexPath:

finalLayoutAttributesForDisappearingSupplementaryElementOfKind:atIndexPath:

finalLayoutAttributesForDisappearingDecorationElementOfKind:atIndexPath:

布局间切换

将一个 collection view
布局动态的切换到此外多个布局。setCollectionViewLayout:animated:(突然想到这种四角碰撞,同时形变的小例子)

察觉火速键: option + command = 在IB中动态标尺

More 更多