#if USE_UIKIT_PUBLIC_HEADERS || !__has_include(<UIKitCore/UICollectionViewCell.h>)
//
// UICollectionViewCell.h
// UIKit
//
// Copyright (c) 2011-2018 Apple Inc. All rights reserved.
//
#import <UIKit/UIView.h>
#import <UIKit/UIKitDefines.h>
#import <UIKit/UICollectionView.h>
NS_ASSUME_NONNULL_BEGIN
@class UICollectionViewLayout;
@class UICollectionView;
@class UICollectionViewLayoutAttributes;
@class UILongPressGestureRecognizer;
/* Cell拖动状态 <枚举> */
typedef NS_ENUM(NSInteger, UICollectionViewCellDragState) {
UICollectionViewCellDragStateNone, /// Cell没有被拖动
UICollectionViewCellDragStateLifting, /// Cell正在拖动
UICollectionViewCellDragStateDragging /// Cell已经开始被拖动(处于“拖动”状态的单元格留下“幻影”外观以表示拖动从哪里开始)
} API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos, watchos);
#pragma mark - 可复用的集合视图 Class
#pragma mark -
/*
- UICollectionViewCell的父类
*/
NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionReusableView : UIView
/// 获取 重用标识符
@property (nonatomic, readonly, copy, nullable) NSString *reuseIdentifier;
// 准备重复使用(复用Cell之前会调用此方法,一般用来重置默认数据,不要设置新数据;需要调回父类)
- (void)prepareForReuse;
/**
自定义布局属性应用于视图
@param layoutAttributes 要应用的布局属性
- 在视图添加到集合视图之后且重用队列返回视图之前调用
- 只在属性更改时调用,由-isEqual:定义
- 如果布局对象支持自定义布局属性,则可以使用此方法将这些属性应用于视图. 在这种情况下,layoutAttributes参数应包含UICollectionViewLayoutAttributes的子类的实例,您不需要重写此方法以支持UICollectionViewLayoutAttributes类的标准布局属性,集合视图自动应用这些属性
*/
- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes;
/* 重写这些方法为特定布局提供自定义UI */
// 告诉View集合视图的布局对象即将更改(此方法的默认实现不执行任何操作,子类可以重写此方法不回调父类,并使用它来准备布局的更改)
- (void)willTransitionFromLayout:(UICollectionViewLayout *)oldLayout toLayout:(UICollectionViewLayout *)newLayout;
// 告诉View集合视图的布局对象已经更改
- (void)didTransitionFromLayout:(UICollectionViewLayout *)oldLayout toLayout:(UICollectionViewLayout *)newLayout;
/**
使单元格有机会修改布局对象提供的属性
@param layoutAttributes 布局对象提供的属性(这些属性表示布局要应用于单元格的值)
@return 应用于单元格的最终属性
- 此方法的默认实现调整大小值以适应自调整单元格所做的更改;
- 子类可以覆盖此方法并使用它来调整其他布局属性(如果您覆盖此方法并希望调整单元格大小,请先调用super并对返回的属性进行自定义修改)
*/
- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes NS_AVAILABLE_IOS(8_0);
@end
#pragma mark - UICollectionViewCell Class
#pragma mark -
/*
- 布局子视图需要添加到 ContentView 上
- 除 ContentView 外,Cell还管理两个背景视图,以显示处于选定/未选定状态的Cell
- 不用单独实例化Cell,使用集合视图注册(或用 Xib 注册);如果注册后需要新的Cell可以调用集合视图的 dequeueReusableCellWithReuseIdentifier:forIndexPath: 方法从缓存池中取出
*/
NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionViewCell : UICollectionReusableView
/// 内容视图(用于承载子视图)
@property (nonatomic, readonly) UIView *contentView;
/// 设置 Cell是否选中
@property (nonatomic, getter=isSelected) BOOL selected;
/// 设置 Cell是否高亮
@property (nonatomic, getter=isHighlighted) BOOL highlighted;
/**
Cell已经开始拖动
@param API_UNAVAILABLE 拖动状态
- 修改此方法可以改变拖动时的特效
- 可选择性回调父类
*/
- (void)dragStateDidChange:(UICollectionViewCellDragState)dragState API_AVAILABLE(ios(11.0)) API_UNAVAILABLE(tvos, watchos);
// 设置 背景视图(视图层级在所有视图的最下层)
@property (nonatomic, strong, nullable) UIView *backgroundView;
// 设置 选中背景视图(如果与backgroundView不同,它将被放置在背景视图上方并在选择中进行动画处理)
@property (nonatomic, strong, nullable) UIView *selectedBackgroundView;
@end
NS_ASSUME_NONNULL_END
#else
#import <UIKitCore/UICollectionViewCell.h>
#endif