1.这个例子表明了通过导航控制器在两个collection视图之间进行切换。切换模式可以被打断也可以反转。使用了UICollectionViewTransitionLayout的子类,并根据手势动作的位置来改变单元的位置。
这个应用有两个视图控制器用于展示图片,第一个是一个堆视图,第二个是格子视图。你可以从通过点击从堆视图变换到格子视图。也可使用pinch手势。
2.UIViewControllerAnimatedTransitioning协议:如果要定义自己创建的视图控制器间的过渡,那么就自定义的类就需要遵守此协议。由此产生的动画过渡委托为视图控制器提供了固定的持续时间,非交互式的自定义过渡。
用animateTransition:方法实现过渡,用transitionDuration:方法指定时间
采用交互式过渡委托,即遵守了UIViewControllerAnimatedTransitioning协议的对象,可以给动画过渡添加用户的交互
执行过渡:- animateTransition:require method,执行自定义视图控制器的过渡动画(required)
- animateEnd:过渡结束时调用
过渡时长:- transitionDuration:require method,当系统在过渡时需要知道过渡时间时调用(以秒计算)
3.UIViewControllerInteractiveTransitioning协议:为了使对象(如导航控制器)能够驱动视图控制器的过渡,需要在自己创建的类中采用本协议。支持本协议的对象称为交互式过渡委托。
交互式过渡委托可以通过加快,减慢或者反转视图控制器的进程来响应触碰事件,随时间变化的编程输入。例如,导航控制器上的交互过渡可以通过移动视图来响应swipe动作或者在导航栏上关闭它
为了支持交互式视图控制器的过渡,你必须提供过渡的委托,即遵循了此协议的对象。过渡委托和过渡动画可以只在一个自定义的类中定义,但是前提是该类必须遵循了这个协议。
实例方法:
- (UIViewAnimationCurve)completionCurve:当过渡需要完成动画曲线时调用,默认值是UIViewAnimationCurveEaseInOut。(可用UIViewAnimationCurve的其他类型)
- (CGFloat)completionSpeed:交互部分完成后,过渡所需要的速度值
- (void)startInteractiveTransition:(id<UIViewControllerContextTransitionning>)transitionContext:当系统需要设置交互部分并开始动画时调用(required)
在接口中添加collection view时,app的主要工作就变成管理跟该view相关的数据。collection view从data source对象(遵循UICollectionViewDataSource)中获取数据。Collection view的数据都是由单一的项目组成的。例如在photos应用中,一个项目就是一张相片。Collection view用cell展示它的数据,而cell是UICollectionViewCell的实例。
除了cells以外,collection view也可以使用其他类型的视图。这些补充的视图像页头和页眉一样从单个cell中分离开来。
除了嵌入用户界面外,也可是使用UICollectionView对象方法来确保项目的视觉呈现跟你的data source对象顺序一样。因此。当你添加,删除或者重新排列数据时,你都要使用插入,删除和重排的方法来操作对应的cell。当然,你也可以使用collection view对象来管理选择项。
Collection Views和布局对象
布局对象是UICollectionViewLayout的子类。主要负责定义所有cell的组织和位置,还有collection view的补充视图。但是虽然它定义了它们的位置,但是布局对象实际上并没有在相应的视图上运用到。因为cells的创建和补充视图涉及到collection view和data source对象之间的协调。因此,布局对象实际上更像是只提供了视觉信息的data source。
当创建collection view时通常会指定一个布局对象,但是也会动态改变view的布局。布局对象被保留在collectionViewLayout属性中。设置这个属性会马上改变布局,无需通过动画改变。如果想通过动画来改变的话,可以使用setCollectionViewLayout:animated:completion:。
如果想创建交互式过渡,即由手势识别或者触碰事件来驱动的话,使用startInteractiveTransitionToCollectionViewLayout:completion:方法来改变布局对象。
创建cells和补充视图
Collection view的data source对象提供了项目的内容和用于呈现内容的视图。当collection view首次加载内容时,它会向它的data source发送请求要求其提供每个可视项目的视图。为了简化创建进程,collection view需要你不断dequeue视图,而不是创建。有两个方法能完成这个操作:
在collection view中获取某项目的cell:dequeueReusableCellWithReuseIdentifier:forIndexPath:
得到布局对象要求的补充视图:dequeueReusableSupplementaryViewOfKind:withReuseIdentifier:forIndexPath:
在调用这些方法之前,你必须告诉collection view怎样创建仍不存在的相应视图。因此,你需要注册类或者nib文件。比如,注册cells时,你使用registerClass:forCellWithReuseIdentifier:或者registerNib:forCellWithReuseIdentifier:。
Properties
allowsMutipleSelection:决定用户是否能够多选的BOOL值。默认值是NO
allowsSelection:决定用户能否选择collection view的BOOL值。默认值是YES。
backgroundView:背景View
collectionViewLayout:用于组织collected view的项目。
dataSource:提供了数据
delegate:委托
实例方法:
指示怎样把某个项目滚动到collection view的可视部分
enum { UICollectionViewScrollPositionNone = 0, UICollectionViewScrollPositionTop = 1 << 0, UICollectionViewScrollPositionCenteredVertically = 1 << 1, UICollectionViewScrollPositionBottom = 1 << 2, UICollectionViewScrollPositionLeft = 1 << 3, UICollectionViewScrollPositionCenteredHorizontally = 1 << 4, UICollectionViewScrollPositionRight = 1 << 5 }; typedef NSUInteger UICollectionViewScrollPosition; UICollectionViewLayoutInteractivTransitionCompletion 在交互过渡的最后调用模块typedef void(^UICollectionViewLayoutInteractiveTransitionCompletion)(BOOL completed, BOOL finish);
typedef struct UIOffset { CGFloat horizontal, vertical } UIOffset;
在跟踪用户交互时,你的手势识别器和事件处理代码会在交互通知你用户准备取消或者舍弃视图过渡时调用此方法。
通常会与completeTransition:方法一起调用。
- (void)completeTransition:(BOOL)didComplete:通知系统过渡动画已经完成(required)
- (UIView *)containerView:充当过渡视图中的父视图(required)
- (CGRect)finalFrameForViewController:(UIViewController *)vc:返回指定视图控制器的结束框架的矩形范围(required)
该方法返回的矩形代表了在过渡结束时相对应的视图的size。对于一开始的视图控制器,此方法的返回值为CGRectZero。
- (void)finishInteractiveTransition:通知系统用户交互标志着完成过渡(required)
- (CGRect)initialFrameForViewController:(UIViewController *)vc:返回指定视图控制器的视图的起始框架(required)
- (BOOL)isAnimated:返回在模态呈现风格下,过渡是否应进行动画处理的BOOL值(required)
- (BOOL)isInteractive:返回当前过渡是否交互式的BOOL值(required)
- (UIModalPresentationStyle)presentationStyle:返回视图控制器过渡的呈现样式(required)
- (BOOL)transitionWasCancelled:决定过渡能否被取消(required)
- (void)updateInteractiveTransition:(CGFloat)percentComplete:升级过渡完成进度(required)
- (UIViewController *)viewControllerForKey:(NSString *)key:返回过渡中指定的视图控制器(required)
常量:
NSString *const UITransitionContextFromViewControllerKey; :指定过渡起始的视图控制器 NSString *const UITransitionContextToViewControllerKey;:结束时的view controller
11.设置成readwrite的property:getter和setter都需要在implemention中实现
12.UICollectionViewLayout
- (void)prepareLayout:让布局对象升级布局。布局的更新发生在第一次collection view呈现内容还有由于改变视图引起的布局无效时。在每一次布局更新时,collection view会首先调用此方法来让布局对象有机会准备将要发生的布局操作。prepareLayout:的默认操作是不做任何事。子类可以覆写它并用它来设置数据结构或者执行任何以后布局里所需的初始计算。
13.CALayer
@property unsigned int edgeAntialiasingMask:决定了接收者的边缘如何抗锯齿。这个属性决定了该层的哪个边缘是反锯齿和处于“Edge Antialiasing Mask”中定义的常量组合。你可以启动或者取消每个边缘的反锯齿。默认的所有边缘都是反锯齿的。