2013-06-03 2 views
1

Я пытаюсь создать пользовательский разбитый макет с использованием UICollectionView. Он отображает как можно больше в симуляторе после запуска моего приложения.Collection View, с пользовательскими макетами, ячейки misbehave при прокрутке

Но в тот момент, когда я просматриваю представление и возвращаю его, все изменения рамки ячейки и ячейки перекрываются, оставляя пробелы случайным образом.

Я не могу решить эту проблему за последние 2 дня. Здесь идет код из моего собственного класса макета.

-(void)prepareLayout{ 
[self createCellSizeArray];//cellSizeArray holds cell sizes for all the cells(calculated statically) 
[self createAttributeArrayOfAll];//attributeArrayOfAll holds attributes for all the cells and also calculates their frames using cellSizeArray 
} 

-(CGSize)collectionViewContentSize{ 
    return CGSizeMake(768, 1500);//The size is static to check for scrolling, is this creating problems? 
} 

-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{ 
     UICollectionViewLayoutAttributes * layoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; 
     return layoutAttributes; 
} 

-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{ 
    NSMutableArray *attArray =[NSMutableArray array]; 
    for (NSInteger i =0; i< attributeArrayOfAll.count; i++) { 
    UICollectionViewLayoutAttributes * attribute = (UICollectionViewLayoutAttributes*)[attributeArrayOfAll objectAtIndex:i]; 
    if(CGRectIntersectsRect(rect, attribute.frame)){ 
     [attArray addObject:attribute]; 
    } 
} 
return attArray; 
} 

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{ 
    return YES; 
} 

Пожалуйста, помогите, заблаговременно.

Edit: В моей [self createAttributeArrayOfAll]; я эти строки кода

CGRect frame = CGRectMake(_startNewRowPoint.x, _startNewRowPoint.y, cellSize.width, cellSize.height); 
UICollectionViewLayoutAttributes * attribute = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:[NSIndexPath indexPathForItem:i inSection:0]]; 
attribute.alpha = 1.0; 
attribute.frame = frame; 
[attributeArrayOfAll addObject:attribute]; 

В то время как я изменил layoutAttributesForItemAtIndexPath:, чтобы выглядеть как этот

-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{ 
UICollectionViewLayoutAttributes * layoutAttributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; 
layoutAttributes.frame = ((UICollectionViewLayoutAttributes*)[attributeArrayOfAll objectAtIndex:indexPath.item]).frame; 
return layoutAttributes; 
} 

Кроме того, метод layoutAttributesForItemAtIndexPath: никогда не вызывается неявно. Я даже пробовал это:

-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{ 
NSMutableArray *attArray =[NSMutableArray arrayWithCapacity:attributeArrayOfAll.count]; 
for (NSInteger i =0; i< attributeArrayOfAll.count; i++) { 
    UICollectionViewLayoutAttributes * attribute = (UICollectionViewLayoutAttributes*)[attributeArrayOfAll objectAtIndex:i]; 
    if(CGRectIntersectsRect(rect, attribute.frame)){ 
     [attArray insertObject:[self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:i inSection:0]] atIndex:i]; 
    } 
} 
return attArray; 
} 

Но все же результатом является тот же искаженный набор ячеек при прокрутке. Я работал с 5 ячейками, в первый раз, когда он правильно отображается, при прокрутке и возвращении обратно в видимый прямоугольник он искажается, если я снова прокручу и верну его в видимый прямоугольник, который он правильно отображает. Однако, когда я делаю это примерно с 400 ячейками, как только я прокручу его, он никогда не будет корректно отображаться. Даже при перегрузке коллекции, ячейки искажаются. Пожалуйста помоги.

ответ

0

Итак, наконец, удалось обходное решение !!! каждый из очереди клетки с уникальным идентификатором Cell в cellForRow:

[self.summaryView registerClass:[BFSSummaryViewCell class] forCellWithReuseIdentifier:[NSString stringWithFormat:@"%@%d",CellIdentifier,indexPath.row]]; 
UICollectionViewCell *collectionCell = [collectionView dequeueReusableCellWithReuseIdentifier:[NSString stringWithFormat:@"%@%d",CellIdentifier,indexPath.row] forIndexPath:indexPath]; 

Эти две линии внутри cellForRow работал для меня, но с моей точки зрения коллекции, имеющие около 1000 клеток, что увеличивает размер моего приложения значительно. Надеемся, что яблоко исправляет эту ошибку как можно скорее.

+3

Извините, но это ужасный способ решить эту проблему. Архитектура класса UICollectionView настроена так, чтобы вы повторно использовали ячейки. Если у вас есть другой класс ячейки для каждой возможной ячейки, вы просто делаете что-то трудное для себя. Попытайтесь решить фактическую проблему, с которой вы столкнулись, без использования этого взлома. – buildsucceeded

+0

@buildsucceeded Я знаю, что это печальный и плохой выход. Но я нашел открытый радар для этой проблемы и не имел другого выбора, несмотря на то, что пытался почти все. Если вы можете поделиться лучшим решением, вы более чем рады. Поверьте мне, мой просмотр коллекции стал очень сердитым при прокрутке. У меня кошмары !!!! :) –

+0

Похоже, вы пытаетесь сделать слишком много управления ячейками самостоятельно, даже без этого «обходного пути» наличия (содрогания) одного класса на ячейку. Где вы называете cellForItemAtIndexPath и dequeuing? Если бы я был вами, я бы начал в совершенно новом проекте и удостоверился, что dequeuing работает, не вникая в атрибуты, прежде чем я начал переопределять любые методы, которые вы используете. – buildsucceeded

3

Ваш метод layoutAttributesForItemAtIndexPath: не устанавливает никаких свойств объекта layoutAttributes перед его возвратом. Он должен установить frame (или center и size).

Смежные вопросы