我正在使用帶有自定義佈局的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]);
}]];
這工作不錯,但它是laggy和神經質,當我有超過50列和50行。這個問題我現在是,我必須設置
-(BOOL)shouldInvalidateLayoutForBoundsChange {
return YES;
}
這使得準備整個佈局每次界限變化,這不用說,對性能有很大的影響,你可以勉強滾動。這些單元格僅由具有不透明背景的文本組成,因此這裏沒有問題。
我相信我沒有這樣做,並且必須有更好的方法。我在這裏先向您的幫助表示感謝。
您應該使用儀器,看看你是在滾動過程中花費的時間。 – nielsbot 2013-03-02 18:46:15
我建議在元素添加到您的收藏視圖時進行佈局。無需佈置已經存在的元素 - 它們處於正確的位置。如果你這樣做,你可以關閉'shouldInvalidateLayoutForBoundsChange' – nielsbot 2013-03-02 18:48:16
@nielsbot我有補充視圖充當頭,必須始終設置爲collectionview的內容偏移量。這些位於視圖的頂部和側面。如果我打開'shouldInvalidateLayoutForBoundsChange',那麼頭部不再「浮動」它們應該在的位置。有沒有不同的解決方案? – 2013-03-02 19:18:27