UICollectionViewLayoutAttributes

父類:NSObject

一個UICollectionViewLayoutAttributes對象管理著一個Collection View中給定的一個Item的布局有關的屬性。當被Collection View要求時布局對象創建這個類的實例。反之,Collection View使用布局信息在它的bounds中放置CellSupplementary View

一、概述

子類化注意

大多數情況下,你像這樣使用這個類。如果你想要使用自定義布局屬性來補充基本的布局屬性,你可以聲明一個子類,并且定義任何你想要存儲額外的布局數據的屬性。由于布局屬性對象可能會被Collection View復制,請確保你的子類遵循NSCopying協議的方法的實現,以便于恰當的復制你的自定義屬性到一個新的你自定義的子類中。除了定義你的子類之外,你的UICollectionReusableView對象需要實現- (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes;方法,以便于它們可以布局階段在展示任何自定義屬性
如果你子類化并且實現任何自定義布局屬性,你也必須重寫繼承的isEqual:方法來比較你的自定義屬性的值。在iOS 7以及之后的版本中,如果布局屬性沒有被改變那么Collection View就不顯示這些布局屬性。這個取決于通過isEqual:方法比較新舊兩個屬性對象是否發生改變。由于這個方法的默認實現只會檢查這個類原本存在的屬性,你必須執行你自己的寫的這個方法來比較你額外添加的屬性。如果你的自定義屬性都是相等的,那么在你的實現的最后要調用super并且返回super返回的結果。

二、內容

1. 創建布局屬性

+ (instancetype)layoutAttributesForCellWithIndexPath:(NSIndexPath *)indexPath;

創建并返回一個表示給定索引值對應的Cell的布局屬性對象。
使用這個方法為Collection View中的一個Cell創建一個布局屬性對象。Cell是一個通過Collection View視圖展現的主要類型。一個Cell的索引通常包含了一個Section的索引和一個Item的索引,這個索引是這個Cell的內容在Collection View的數據源中的位置。

+ (instancetype)layoutAttributesForSupplementaryViewOfKind:(NSString *)elementKind withIndexPath:(NSIndexPath *)indexPath;

創建并返回一個表示給定索引值對應的Supplementary View的布局屬性對象。
使用這個方法為Collection View中的一個Supplementary View創建一個布局屬性對象。和Cell一樣,Supplementary View當前的數據是被Collection View數據源所管理的。但是和Cell不同的是,Supplementary View通常是為特殊目的而設計的。例如,HeaderFooterCell的放置位置不同,是提供給在單個的Section或者整個Collection View的。
由你來決定如何使用indexPath參數來識別一個給定的Supplementary View。通常,你使用elementKind屬性來確定Supplementary View的類型,然后使用indexPath的信息來識別不同Supplementary View實例。

+ (instancetype)layoutAttributesForDecorationViewOfKind:(NSString *)decorationViewKind withIndexPath:(NSIndexPath *)indexPath;

創建并返回一個表示給定索引值對應的Decoration View的布局屬性對象。
使用這個方法為Collection View中的一個Decoration View創建一個布局屬性對象。Decoration ViewSupplementary View的一種,但是不會展示被Collection View數據源所管理的數據。相反,它們大多數為一個Section或者整個Collection View呈現視覺裝飾效果。
由你來決定如何使用indexPath參數來識別一個給定的Decoration View。通常,你使用decorationViewKind屬性來確定Decoration View的類型,然后使用indexPath的信息來識別不同Decoration View實例。

2. Identifying the Referenced Item

@property(nonatomic, strong) NSIndexPath *indexPath;

Collection ViewItem的索引值。
索引包含了一個Section的索引和一個Item在這個Section中的索引。這兩個值標示在Collection View唯一的對應的Item的位置。

@property(nonatomic, readonly) UICollectionElementCategory representedElementCategory;

Item的類型。
你可以使用這個屬性的值來區分這個布局屬性是用于一個Cell還是Supplementary View還是Decoration View

UICollectionElementCategory

typedef NS_ENUM(NSUInteger, UICollectionElementCategory) {
    UICollectionElementCategoryCell, // Cell
    UICollectionElementCategorySupplementaryView, // Supplementary View
    UICollectionElementCategoryDecorationView // Decoration View
};
@property(nonatomic, readonly) NSString *representedElementKind;

目標視圖的布局指定標識符。
你可以使用這個屬性的值來標識Supplementary View或者Decoration View相關聯的屬性給定的目的。如果representedElementCategory屬性為UICollectionElementCategoryCell,那么這個屬性為nil

3. 訪問布局屬性

@property (nonatomic) CGRect frame;

Item的矩形邊框。
這個矩形邊框是測量在給定的Collection View坐標系中的點。設置這個屬性的值也等于設置center屬性。

@property (nonatomic) CGRect bounds;

Itembounds
當設置bounds屬性時,bounds屬性中的origin必須被設置為(0, 0)。改變bounds屬性也會使用新的bounds中的size來匹配改變size屬性。

@property (nonatomic) CGPoint center;

Item的中心點。
這個中心點是在給定的Collection View坐標系中的點。設置這個屬性的值也會更新frame屬性中的origin的值。

@property (nonatomic) CGSize size;

Item的大小。
設置這個屬性的值也會更新frame屬性中的size的值。

@property (nonatomic) CATransform3D transform3D;

Item的三維變換。
使用你指定的3D轉換的仿射版本賦值給這個屬性來替換transform屬性的值。

@property (nonatomic) CGAffineTransform transform;

Item的仿射變換。
使用你指定的仿射變換賦值給這個屬性來替換transform3D屬性的值。

@property (nonatomic) CGFloat alpha;

Item的透明度。
值在0.0(透明)到1.0(不透明)之間。默認為1.0

@property (nonatomic) NSInteger zIndex;

指定Item在z軸上的位置。
這個屬性被用來確定在布局時Item的前后順序。大的zIndex值的Item會被顯示在小的zIndex值的Item上面。這個屬性使用相同的值的Item的順序是不確定的。
這個屬性的值默認為0

@property(nonatomic, getter=isHidden) BOOL hidden;

決定Item是否在當前情況下顯示。
這個屬性的默認值為NO。為了優化,Collection View可能不會創建這個屬性設置為YESItem

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容