Определение UICollectionViewCell с помощью наконечника

Если я правильно понимаю, содержимое UICollectionViewCell должно войти в его свойство contentView и фон в backgroundView.

Тем не менее, когда я перетаскиваю UICollectionViewCell в Interface Builder, не упоминается contentView или backgroundView. Если я добавлю subviews, у них будет целая ячейка как ее родительская, а не contentView или backgroundView.

Каков правильный способ определения UICollectionViewCell с IB, тогда?

Ответ 1

"Если я добавлю subviews, они будут иметь целую ячейку как ее родительскую, а не contentView"

Это неверно. Если вы перетаскиваете элемент UICollectionViewCell и добавляете к нему элементы пользовательского интерфейса, вы добавляете их в представление содержимого. Тот факт, что он не отображается в списке объектов, не означает, что он не существует (то же самое верно для NSBox - он имеет представление контента, которое также не отображается в IB). Если в collectionView: didSelectItemAtIndexPath:, вы регистрируете cellForItemAtIndexPath и смотрите на его subviews, вы найдете только одно, и это то же самое, что вы получаете, регистрируя cell.contentView. Если вы занесете свои подпункты, вы увидите свои элементы пользовательского интерфейса.

Теперь, если смотреть в фоновом режиме, я не думаю, что вы можете получить доступ к IB. У вас может быть xib файл с UIView, а затем назначить его свойству cellView.

Ответ 2

Из-за отсутствия лучшего варианта я использую отдельные файлы nib для contentView и backgroundView. Затем в моем подклассе UICollectionViewCell:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        NSArray *contentViewNib = [[NSBundle mainBundle] loadNibNamed:@"CollectionViewCellContentView" owner:self options:nil];
        [self.contentView addSubview:contentViewNib[0]];
        NSArray *backgroundViewNib = [[NSBundle mainBundle] loadNibNamed:@"CollectionViewCellBackgroundView" owner:self options:nil];
        self.backgroundView = backgroundViewNib[0];
    }
    return self;
}

Ответ 3

Я не уверен, что это новое для Xcode 8, но UICollectionViewCell включает выходы для подключения backgroundView и selectedBackgroundView.

введите описание изображения здесь

Благодаря этому вы можете добавить UIView (или подкласс) в ячейку просмотра коллекции и подключить его к одному из выходов. Таким образом, вы сможете определить их с помощью IB.

введите описание изображения здесь

Надеюсь, это поможет!