Я новичок в UICollection View. Некоторые ячейки не отображаются, как показано на изображении ниже. Это мой код для его настройки, был бы счастлив, если бы кто-нибудь мог объяснить, почему некоторые ячейки отсутствуют. Кроме того, при прокрутке вверх и вниз изображения в ячейке будут меняться по какой-либо причине (хотя на этом снимке экрана я использую одни и те же изображения для всех ячеек). Вся вторая и четвертая строки отсутствуют, а средний столбец отсутствует. Цель состоит в том, чтобы иметь ряды по три изображения на одну строку рядом друг с другом. Благодаря!UICollectionView неправильно отображает ячейки
UICollectionViewFlowLayout *layout=[UICollectionViewFlowLayout new];
self.collectionView=[[UICollectionView alloc] initWithFrame:Frame(0,225,1080, Denormalize(screenHeight) - 225) collectionViewLayout:layout];
[self.collectionView setDataSource:self];
[self.collectionView setDelegate:self];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[self.collectionView setBackgroundColor:[UIColor redColor]];
layout.minimumLineSpacing = 0;
layout.minimumInteritemSpacing = 0;
layout.sectionInset = UIEdgeInsetsMake(0,0,0,0);
[self.view addSubview:_collectionView];
#pragma mark - CollectionView delegate
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return self.allVideos.count;
}
// The cell that is returned must be retrieved from a call to -dequeueReusableCellWithReuseIdentifier:forIndexPath:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell=[collectionView dequeueReusableCellWithReuseIdentifier:@"cellIdentifier" forIndexPath:indexPath];
// cell.backgroundColor=[UIColor greenColor];
NSDictionary *video = self.allVideos[indexPath.row];
UIImageView *thumbnail = [UIImageView new];
thumbnail.contentMode = UIViewContentModeScaleAspectFill;
thumbnail.frame = cell.frame;
thumbnail.clipsToBounds = YES;
thumbnail.image = [UIImage imageNamed:@"DefaultAvatar.png"];
// thumbnail.image = video[@"image"];
[cell addSubview:thumbnail];
return cell;
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
return CGSizeMake(self.view.frame.size.width/3, self.view.frame.size.width/3);
}
Хороший вопрос, хотя он не затрагивает вопрос. Я ненавижу подклассирование - делает код слишком зернистым. Есть ли способ проверить, есть ли у клетки уже дерьмо? – etayluz
Я обновил свой комментарий, включая мое исправление недостающих изображений, используя ограничения макета. Вы могли бы гипотетически пометить подзаголовок, который вы добавляете в cellForItemAtIndexPath, а затем проверить подпункты ячейки для представления с вашим конкретным тегом, но для этого потребовалось бы итерации над подзонами ячеек всякий раз, когда он удаляется, что является дополнительной работой без реальной причины.Я думаю, что стандартная и предпочтительная практика в объектно-ориентированных языках, таких как Obj-C, определенно будет подклассом в этом случае. – Dare
Yup, это было бы принятым способом - ну, я встроенный парень C - объектно-ориентированный никогда не был моим делом, мне нравится код, короткий, читаемый, сладкий и лаконичный. Если у вас есть идея, почему UICollectionView пропускает некоторые ячейки, дайте мне знать, возможно, есть способ проверить, была ли ячейка уже инициализирована для этой строки, прежде чем вызывать dequeueReusableCellWithReuseIdentifier – etayluz