Collection View Transition

苏鸿志
2023-12-01

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)


4.UINavigationControllerOperation:typedef enum {
                                                                                   UINavigationControllerOperationNone,
                                                                                   UINavigationControllerOperationPush,
                                                                                   UINavigationControllerOperationPop
                                                                                  }
这三个常量定义了导航控制器的过渡类型。

5.UICollectionView:UICollectionView类管理了数据项的有序集合,并且采用自定义布局呈现它们。Collection视图提供了多列表视图的方法。可用于实现多列网格,平铺布局,圆形布局以及其他可定制的布局等。

在接口中添加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:委托


实例方法:

- (void)cancelInteractiveTransition :令collection view放弃交互式过渡,返回原来的布局对象。
在调用startInteractiveTransitionToCollectionViewLayout:completion:方法还有通过手势识别和其他处理代码之后调用此方法。这个方法移除了中间过渡的布局对象并且重新安装原来的布局对象。
- (UICollectionViewCell *)cellForItemAtIndexPath:(NSIndexPath *)indexPath:返回指定索引路径的cell
- (void)deleteItemsAtIndexPaths:( NSArray *) indexPaths:删除指定的项目
- (void)deleteSections:( NSIndexSet *) sections:删除指定的段
- (id)dequeueReusableCellWithReuseIdentifier:( NSString *) identifier forIndexPath:( NSIndexPath*) indexPath:根据标识符返回重用cell
- (id)dequeueReusableSupplementaryViewOfKind:( NSString*) elementKind withReuseIdentifier:( NSString *) identifier forIndexPath:( NSIndexPath*) indexPath:返回重用补充视图
- (void)deselectItemAtIndexPath:( NSIndexPath *) indexPath animated:(BOOL) animated:取消选择指定的项目
- (void)finishInteractiveTransition:通过安装预定的布局完成交互式过渡
- ( NSIndexPath *)indexPathForCell:( UICollectionViewCell *) cell:返回指定cell的索引路径
- ( NSIndexPath *)indexPathForItemAtPoint:( CGPoint) point:返回指定点的项目的索引路径
- ( NSArray *)indexPathsForSelectedItems:返回选择的项目的索引路径
- ( NSArray *)indexPathsForVisibleItems:返回可视项目的数组
- (id)initWithFrame:( CGRect) frame collectionViewLayout:( UICollectionViewLayout *) layout:用指定的框架和布局创建并返回collection view对象
- (void)insertItemsAtIndexPaths:( NSArray *) indexPaths:在指定位置插入项目
- (void)insertSections:( NSIndexSet *) sections:在指定位置插入段
- ( UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:( NSIndexPath *) indexPath:返回指定位置的布局信息
- ( UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryElementOfKind:( NSString *) kind atIndexPath:( NSIndexPath *) indexPath:返回指定补充视图的布局信息
- (void)moveItemAtIndexPath:( NSIndexPath *) indexPath toIndexPath:( NSIndexPath *) newIndexPath:移动项目
- (void)moveSection:( NSInteger) section toSection:( NSInteger) newSection:移动某个部分
- ( NSInteger)numberOfItemsInSection:( NSInteger) section:指定部分的项目数
- ( NSInteger)numberOfSections:段落数目
- (void)performBatchUpdates:(void (^)(void)) updates completion:(void (^)(BOOL finished)) completion:插入,删除,重装和移动操作的动画群体
- (void)registerClass:(Class) cellClass forCellWithReuseIdentifier:( NSString *) identifier:注册类,用于创建新cells.
- (void)registerClass:(Class) viewClass forSupplementaryViewOfKind:( NSString *) elementKind withReuseIdentifier:( NSString *) identifier:注册类,创建新的补充视图
- (void)registerNib:( UINib *) nib forCellWithReuseIdentifier:( NSString *) identifier:注册nib,用于创建新cells.
- (void)registerNib:( UINib *) nib forSupplementaryViewOfKind:( NSString *) kind withReuseIdentifier:( NSString *) identifier:注册nib,创建新的补充视图
- (void)reloadData:重新加载数据
- (void)reloadItemsAtIndexPaths:( NSArray *) indexPaths:重载指定索引的项目
- (void)reloadSections:( NSIndexSet *) sections:重载指定部分的项目
- (void)scrollToItemAtIndexPath:( NSIndexPath *) indexPath atScrollPosition:( UICollectionViewScrollPosition) scrollPosition animated:(BOOL) animated:滚动view直到指定项目可见
- (void)selectItemAtIndexPath:( NSIndexPath *) indexPath animated:(BOOL) animated scrollPosition:( UICollectionViewScrollPosition) scrollPosition:选择指定索引路径的项目并可选的滚动
- (void)setCollectionViewLayout:( UICollectionViewLayout *) layout animated:(BOOL) animated:改变布局,可选动画变化
- (void)setCollectionViewLayout:( UICollectionViewLayout *) layout animated:(BOOL) animated completion:(void (^)(BOOL finished)) completion:改变布局,并在动画完成时通知
- (UICollectionViewTransitionLayout *)startInteractiveTransitionToCollectionViewLayout:(UICollectionViewLayout *)layout completion:(UICollectionViewLayoutInteractiveTransitionCompletion)completion
使用交互过渡改变当前布局
- (NSArray *)visibleCells:返回当前可视cell的数组

常量:
UICollectionScrollPosition

指示怎样把某个项目滚动到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); 

6.UIOffset:定义了一个结构用于偏移:
typedef struct UIOffset {
   CGFloat horizontal, vertical
} UIOffset;

7.- (CGFloat)valueForAnimatedKey:(NSString *)key
返回最近指定键的设置值。在布置collection view的内容时调用这个方法来取回浮点值。你所指定的键是你自己定义的字符串。在交互过渡期间可以使用updateValue:forAnimatedKey:来分配新值

8.UICollectionViewTransitionLayout:
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect
返回所指定矩形中的所有cells和视图的布局属性。 UICollectionViewTransitionLayout的子类都必须覆写这个方法,并用其返回与指定矩形范围有关视图的项目的布局信息。覆写的方法必须实现所有可见的元素,包括cells,补充视图和装饰视图。当创建布局属性时,需要创建代表正确元件类型的属性对象。Collection view区分每一个类型的属性,并用这些信息来确定该创建哪种视图还有如何管理视图。

9.UICollectionViewTransitionLayout
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
返回指定索引路径的项目的布局属性
子类必须覆写这个方法。只为那些有对应cell的项目使用这个方法来获取布局信息。不可以在补充视图或者装饰视图上使用

10.UIViewControllerContextTransitioning
在自定义的过渡委托中(遵循了UIViewControllerAnimatorTransitioning或者UIViewControllerInteractiveTransitioning的对象)使用UIViewControllerContextTransitioning协议的方法取回视图过渡的上下文信息
实例方法:
- (void)cancelInteractiveTransition:通知系统用户取消了过渡(required)

在跟踪用户交互时,你的手势识别器和事件处理代码会在交互通知你用户准备取消或者舍弃视图过渡时调用此方法。

通常会与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”中定义的常量组合。你可以启动或者取消每个边缘的反锯齿。默认的所有边缘都是反锯齿的。


14.UICollectionViewCell
@property (nonatomic, readonly) UIView *contentView:你所添加的cell的自定义内容的主视图。在配置cell的时候,你可以添加你自定义的视图内容来代表cell。cell会把这个视图放在所有背景视图之前。

15.UICollectionView
- (void)registerClass:(Class)cellClass forCellWithReuseIdentifier:(NSString *)identifier:注册一个类来创建新的collection view cells
在调用dequeueReusableCellWithReuseIdentifier:forIndexPath:之前,必须调用本方法或者registerNib:forCellWithReuseIdentifier:来告诉collection view怎样创建给定类型的cell。如果并没有在重用序列中明确地指定cell类型,collection view会使用已经提供的信息来自动创建一个cell对象。



 类似资料:

相关阅读

相关文章

相关问答