Добавление subview в UICollectionViewCell, который обрабатывает весь кадр ячейки
Я пытаюсь просто добавить UIView в UICollectionViewCell, который обрабатывает весь фрейм ячейки. В коде, который у меня есть, теперь отображается только одна ячейка в верхнем левом углу (я подозреваю, что каждая ячейка получает слой поверх друг друга). Как я могу это сделать?
Я планирую позже подклассифицировать UIView, чтобы настроить представление, которое я добавляю в ячейку. Я не хочу подкласса UICollectionViewCell, однако, основываясь на том, как я его буду использовать.
#pragma mark - Collection view data source
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return 6;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
UIView *menuItem = [[UIView alloc] init];
menuItem.frame = cell.frame;
menuItem.backgroundColor = [UIColor greenColor];
[cell addSubview:menuItem];
return cell;
}
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath; {
return CGSizeMake(60, 60);
}
Ответы
Ответ 1
Вам нужно использовать bounds
, а не frame
. Если вы не знаете разницы между двумя или почему это имеет значение, вы должны прочитать об этом и получить удовольствие от этого, прежде чем идти дальше:
menuItem.frame = cell.bounds;
Вы также хотите установить маску авторезистирования, поскольку ячейка изначально не будет иметь правильный размер:
menuItem.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
И, действительно, вы должны добавить это свойство ячейки contentView
:
[cell.contentView addSubview:menuItem];
menuItem.frame = cell.contentView.bounds;
Тем не менее, если вы планируете добавить много подзаголовков в menuItem
, я рекомендую подклассифицировать UICollectionViewCell вместо того, чтобы пытаться построить его в вашем методе cellForItemAtIndexPath:
. Будет легче управлять, если макет и настройка инкапсулированы в другой класс, и вы можете реагировать на изменения высоты/ширины, переопределяя layoutSubviews
.
Ответ 2
В этом случае вы должны взаимодействовать с ячейкой contentView
.
UIView *menuItem = [UIView new];
menuItem.frame = cell.contentView.bounds;
menuItem.backgroundColor = [UIColor greenColor];
[cell.contentView addSubview:menuItem];