Добавление 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];