Я пытаюсь создать пользовательский разбитый макет с использованием 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 ячейками, как только я прокручу его, он никогда не будет корректно отображаться. Даже при перегрузке коллекции, ячейки искажаются. Пожалуйста помоги.
Извините, но это ужасный способ решить эту проблему. Архитектура класса UICollectionView настроена так, чтобы вы повторно использовали ячейки. Если у вас есть другой класс ячейки для каждой возможной ячейки, вы просто делаете что-то трудное для себя. Попытайтесь решить фактическую проблему, с которой вы столкнулись, без использования этого взлома. – buildsucceeded
@buildsucceeded Я знаю, что это печальный и плохой выход. Но я нашел открытый радар для этой проблемы и не имел другого выбора, несмотря на то, что пытался почти все. Если вы можете поделиться лучшим решением, вы более чем рады. Поверьте мне, мой просмотр коллекции стал очень сердитым при прокрутке. У меня кошмары !!!! :) –
Похоже, вы пытаетесь сделать слишком много управления ячейками самостоятельно, даже без этого «обходного пути» наличия (содрогания) одного класса на ячейку. Где вы называете cellForItemAtIndexPath и dequeuing? Если бы я был вами, я бы начал в совершенно новом проекте и удостоверился, что dequeuing работает, не вникая в атрибуты, прежде чем я начал переопределять любые методы, которые вы используете. – buildsucceeded