Ячейка UICollectionView не всегда обновляется после прокрутки - программирование
Подтвердить что ты не робот

Ячейка 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" при каждом вызове метода? Нет утечек памяти?

4b9b3361

Ответ 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 перед добавлением нового, это тоже должно быть ОК.