Ячейка UICollectionView не всегда обновляется после прокрутки
Я определил в своей раскадровке (iPad) представление, содержащее UICollectionView
, в нижней части окна также есть UIToolbar
.
В UICollectionView
я добавил UICollectionViewCell
(реализован классом iPadCellCollectionViewCell
), который содержит другое представление, которое является графиком ядра (класс CPTGraphHostingView
).
У меня есть класс под названием X, который реализует UICollectionViewDelegate
и UICollectionViewDataSource
.
В классе X я строю для каждой ячейки моего представления (в ViewDidLoad
) график ядра и у меня есть следующий код для привязки графика к ячейке UICollectionViewCell
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
static NSString* cellId = @"ChartCollectionId";
iPadCellCollectionViewCell* cell = [self.theCollectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath];
MyChart* chart = [_charts objectAtIndex:indexPath.row];
cell.hostingView.hostedGraph = chart.barChart;
return cell;
}
Он работает нормально, все мои графики правильно отображаются на экране. Проблема возникает, когда пользователь просматривает представление, затем одна или несколько ячеек становятся "пустыми". Я действительно не понимаю, почему.
Я нашел обходное решение, вместо добавления CPTGraphHostingView
в UICollectionViewCell
в построителе интерфейса, я сам его создаю, а предыдущий код становится:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
static NSString* cellId = @"ChartCollectionId";
iPadCellCollectionViewCell* cell = [self.theCollectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath];
[cell.contentView addSubview:[_hostingViews objectAtIndex:indexPath.row]];
return cell;
}
С помощью этого кода все работает нормально. Есть ли объяснения, почему он не работает, когда я добавляю CPTGraphHostingView
в UICollectionViewCell
с IB?
Является ли проблема вызова "addSubview" при каждом вызове метода? Нет утечек памяти?
Ответы
Ответ 1
Это похоже на ошибку в UICollectionView при использовании sectionInsets.
Ячейки не становятся невидимыми, они иногда уходят за пределы, иногда при быстрой прокрутке.
Итак, если у вас обычно будет 3 элемента в строке, вы получите четвертый элемент в одной строке, но не элемент в первом месте следующей строки.
Если вы настроили UICollectionView не на клип, а переместите его поверх пользовательского интерфейса,
вы можете увидеть эту несокрашенную ячейку.
Мое решение было пока не использовать sectionInsets и окружать его, используя contentInset и некоторое пустое пространство в заголовках разделов.
Я также нашел некоторых других парней в Twitter с той же проблемой.
Там также сообщается об ошибке: 12353513
Ответ 2
У меня была аналогичная проблема. Я исправил его, вызывая перерисовку, когда setFrame:
вызывается в моем пользовательском контенте. В вашем случае подкласс CPTGraphHostingView
и переопределить этот метод:
-(void)setFrame:(CGRect)frame {
[super setFrame:frame];
[self setNeedsDisplay]; // force drawRect:
}
Изменить: Более простой способ обновить представления ячеек при повторном использовании - это переопределить applyLayoutAttributes:
в iPadCellCollectionViewCell
следующим образом:
-(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
// apply custom attributes...
[self.hostingView setNeedsDisplay]; // force drawRect:
}
Относительно вашего обходного пути: в представлении контента будет больше и больше подпунктов, что, вероятно, не очень хорошо. Однако, если вы удалите любое старое subview перед добавлением нового, это тоже должно быть ОК.