セルをグリッド形式でレイアウトするカスタム レイアウトで UICollectionView を使用しています。50 行と 50 列をはるかに超える場合があります。スクロールは、垂直方向と水平方向の両方で発生します。現在、すべてのレイアウト設定をprepareLayout
配列に保存しています。
- (void)prepareLayout {
NSMutableArray *newLayoutInfo = [[NSMutableArray alloc] init];
NSMutableArray *newLinearLayoutInfor = [[NSMutableArray alloc] init];
NSInteger sectionCount = [self.collectionView numberOfSections];
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0];
self.heightForRows = [delegate collectionViewHeightForAllRows];
self.totalWidthsForRows = [[NSMutableArray alloc] init];
for (int i = 0; i < sectionCount; i++) {
[self.totalWidthsForRows addObject:[NSNumber numberWithInt:0]];
}
for (NSInteger section = 0; section < sectionCount; section++) {
NSMutableArray *cellLayoutInfo = [[NSMutableArray alloc] init];
NSInteger itemCount = [self.collectionView numberOfItemsInSection:section];
for (NSInteger item = 0; item < itemCount; item++) {
indexPath = [NSIndexPath indexPathForItem:item inSection:section];
UICollectionViewLayoutAttributes *itemAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];
itemAttributes.frame = [self frameForCellAtIndexPath:indexPath];
[cellLayoutInfo addObject:itemAttributes];
[newLinearLayoutInfor addObject:itemAttributes];
}
[newLayoutInfo addObject:cellLayoutInfo];
}
self.layoutInfo = newLayoutInfo;
self.linearLayoutInfo = newLinearLayoutInfor;
}
それからlayoutAttributesForElementsInRect
私は持っています:
- (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect {
NSArray *rows = [self.linearLayoutInfo filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(UICollectionViewLayoutAttributes *evaluatedObject, NSDictionary *bindings) {
return CGRectIntersectsRect(rect, [evaluatedObject frame]);
}]];
これは問題なく動作しますが、50 列と 50 行を超えるとラグが発生し、不安定になります。私が今抱えている問題は、設定する必要があるということです
-(BOOL)shouldInvalidateLayoutForBoundsChange {
return YES;
}
これにより、境界が変更されるたびにレイアウト全体が準備されます。これは、言うまでもなく、パフォーマンスに大きな影響を与え、ほとんどスクロールできません。セルは不透明な背景のテキストだけで構成されているため、問題はありません。
私はこれを正しく行っていないと確信しており、より良い方法があるに違いありません。事前に助けてくれてありがとう。