Я использую UICollectionView с настраиваемой компоновкой, которая выставляет ячейки в виде сетки. Может быть более 50 строк и 50 столбцов. Прокрутка происходит как по вертикали, так и по горизонтали. В настоящее время, я делаю все настройки макета в prepareLayout
и хранить его в массивах:UICollectionView Очень медленный пользовательский макет
- (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;
}
Это делает его подготовить весь макет каждый раз, когда изменение границ, которые, разумеется, имеет огромное влияние на производительность, и вы едва прокрутки. Ячейки состоят только из текста с непрозрачным фоном, поэтому проблем там нет.
Я уверен, что я не делаю этого правильно и что должен быть лучший способ. Спасибо за помощь заранее.
Вы должны использовать инструменты, чтобы увидеть, где вы проводите свое время во время прокрутки. – nielsbot
Я рекомендую выложить элементы, поскольку они добавлены в ваш коллекционный вид. Нет необходимости в элементах компоновки, которые уже есть - они находятся в правильных положениях. Если вы сделаете это так, вы можете отключить 'shouldInvalidateLayoutForBoundsChange' – nielsbot
@nielsbot У меня есть дополнительные представления, которые действуют как заголовки, которые всегда должны быть установлены на смещение содержимого коллекции. Они расположены сверху и сбоку. Если я включу 'shouldInvalidateLayoutForBoundsChange', то заголовки больше не будут« плавать »там, где они должны. Есть ли другое решение? –