UIcollectionViewのLayoutについて
5033 ワード
1,Layoutの役割
CollectionView
は、データとレイアウトを厳格に分離しています.多くの場合、あなたのappはデータを提供するだけでいいので、システムが提供するレイアウトはあなたのために多くのことをします.システムが提供するレイアウトは非常に強力で、複数の列のグリッドビューだけでなく、フラットビューと円形ビューも提供できます.システムが提供するレイアウトがあなたのニーズを満たすことができない場合は、レイアウトをカスタマイズすることもできます.2,Configuring FlowLayout
FlowLayout
を使用する手順は、次のとおりです.FlowLayout
オブジェクトを作成し、CollectionView
に値を割り当てます.cell
の幅と高さLineSpacing
とItemSpacing
を設置します.HeaderView
とFooterView
を作成した場合は、size
を指定します.Layout
のスライド方向item
ごとにsize
を指定します.item
のsize
が固定されている場合、itemSize
属性で直接設定されます.cell
にsize
を指定する必要がある場合は、CollectionView
のdelegate
メソッドでcollectionView:layout:sizeForItemAtIndexPath:
メソッドを実装する必要があります.レイアウト中、Layout
オブジェクトは、図のように垂直方向の中央にitem
を配置します.LineSpacing
とItemSpacing
を指定します.minimumLineSpacing
およびminimumInteritemSpacing
の属性を設定することによって行われる.collectionView:layout:minimumLineSpacingForSectionAtIndex:
およびcollectionView:layout:minimumInteritemSpacingForSectionAtIndex:
の2つのdelegate
方法指定inset:
sectionInset
属性- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
プロキシ方法3,Subclassing FlowLayout
FlowLayoutは強力ですが、FlowLayoutをカスタマイズする必要があるかもしれません.
, FlowLayout 。
3.1 Layoutに追加または装飾ビュー(supplementary or decoration View)を追加したいかもしれません。
標準的なFlowLayoutではHeaderViewとFooterViewのみがサポートされていますが、DecorationViewはサポートされていません.装飾ビューを実現するには、次の方法を上書きする必要があります.
layoutAttributesForElementsInRect:
(required) layoutAttributesForItemAtIndexPath:
(required) layoutAttributesForSupplementaryViewOfKind:atIndexPath:
(to support new supplementary views) layoutAttributesForDecorationViewOfKind:atIndexPath:
(to support new decoration views) 3.2 FlowLayoutのレイアウトプロパティを調整したいかもしれません
layoutAttributesForElementsInRect:
というメソッドを上書きし、このメソッドの実装では、super
メソッドを呼び出し、プロパティを変更し、最後にプロパティを返します.例:// UICollectionViewLayoutAttributes ,
- (nullable NSArray<__kindof uicollectionviewlayoutattributes=""> *)layoutAttributesForElementsInRect:(CGRect)rect {
NSArray *array = [super layoutAttributesForElementsInRect:rect];
for (UICollectionViewLayoutAttributes *attributes in array) {
CGRect frame = attributes.frame;
float distance = fabs(self.collectionView.contentOffset.x + self.collectionView.contentInset.left - frame.origin.x);
float scale = 1 * MIN(MAX(1 - distance / self.collectionView.bounds.size.width, 0.8), 1);
attributes.transform = CGAffineTransformMakeScale(scale, scale);
}
return array;
}
3.3新しいレイアウト属性を追加したいかもしれません
UICollectionViewLayoutAttributes
を継承し、独自のLayoutAttributes
を実装し、必要なレイアウト情報を属性として追加することができます.FlowLayout
では、layoutAttributesClass
メソッド3.4 insertまたはdeleteのアニメーションをカスタマイズしたいかもしれません
insert
またはdelete
のいずれかのcellの場合、システムはデフォルトのアニメーションを提供します.自分のアニメーションを実現したい場合は、上書きする方法で実現できます.initialLayoutAttributesForAppearingItemAtIndexPath:
initialLayoutAttributesForAppearingSupplementaryElementOfKind:atIndexPath:
initialLayoutAttributesForAppearingDecorationElementOfKind:atIndexPath:
finalLayoutAttributesForDisappearingItemAtIndexPath:
finalLayoutAttributesForDisappearingSupplementaryElementOfKind:atIndexPath:
finalLayoutAttributesForDisappearingDecorationElementOfKind:atIndexPath:
4,カスタムLayout[]
4.1
カスタムlayoutを作成する前に、
UICollectionViewFlowLayout
が提供する多くの特性が、多くの一般的なlayoutを満たすために最適化されていることを知る必要があります.以下の場合を除き、カスタマイズは推奨されません.line-based breaking
レイアウトではありません(itemsは行がいっぱいになるまで1行に並べ、すべてのitemsが並べられるまで次の行に並べ続けます)、またはCell
の位置を頻繁に変更する必要があるため、既存のlayout
を変更するよりもカスタムflow layout
を作成する方が4.2 UIcollectionViewLayoutの継承
UICollectionViewLayout
を継承した後、レイアウトコア特性を提供するいくつかの方法を再ロードするだけで、他の方法は状況に応じて再ロードするだけで、コア特性は以下の通りです.size
Cell
およびview
に属性オブジェクト