UICollectionView dentro de UIView personalizada

Estoy intentando hacer una barra de herramientas personalizada usando UICollectionView.

Quiero subclass UIView y tener la vista de colección como subvista secundaria.

Estoy usando el layout de flujo estándar y todo funciona bien si agrego una vista de colección a un controller de vista (ver image)

En el momento en que agrego la vista de UICollectionview a las subclasss MY, todo deja de funcionar correctamente. Los elementos aparecen fuera de la vista para comenzar y tengo que desplazarme hacia abajo para verlos. Parece que se está agregando una fila de espacio en blanco antes de que comiencen los elementos.

Cuando invoco contentSize en la colecciónview dentro de mi subclass UIView, devuelve -20 por la altura por alguna razón.

Estoy apuntando a la fuente de datos de CollectionView alojada directamente en la vista de controlleres de vista en una instancia de mi barra de herramientas para que pueda descartar diferencias de código. ¿Estoy pensando que tal vez me falte un tema sutil tal vez relacionado con los events del ciclo de vida de UIView?

introduzca la descripción de la imagen aquí

Aquí está el código:

- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } -(void)updateConstraints { [super updateConstraints]; UIView* view = _collectionView; [self addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:view.superview attribute:NSLayoutAttributeTop multiplier:1 constant:0]]; [self addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:view.superview attribute:NSLayoutAttributeBottom multiplier:1 constant:0]]; [self addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:view.superview attribute:NSLayoutAttributeLeading multiplier:1 constant:0]]; [self addConstraint:[NSLayoutConstraint constraintWithItem:view attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:view.superview attribute:NSLayoutAttributeTrailing multiplier:1 constant:0]]; } -(void)layoutSubviews { [super layoutSubviews]; [_collectionView reloadData]; } +(BOOL)requiresConstraintBasedLayout { return YES; } -(id)initWithCoder:(NSCoder *)aDecoder { if (self = [super initWithCoder:aDecoder]) { _itemsVisibleAtOnce = 5; // dispatch_async(dispatch_get_main_queue(), ^{ UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init]; // layout.scrollDirection = UICollectionViewScrollDirectionHorizontal; UICollectionView* collectionView = [[UICollectionView alloc] initWithFrame:self.bounds collectionViewLayout:layout]; _collectionView = collectionView; [self.collectionView registerNib:[UINib nibWithNibName:@"OSButtonBarCell" bundle:nil] forCellWithReuseIdentifier:REUSUE_OS_TAB_CELL]; _collectionView.delegate = self; _collectionView.dataSource = self; _collectionView.translatesAutoresizingMaskIntoConstraints = NO; [self addSubview:_collectionView]; // [self invalidateIntrinsicContentSize]; [self setNeedsUpdateConstraints]; // }); } return self; } /* // Only override drawRect: if you perform custom drawing. // An empty implementation adversely affects performance during animation. - (void)drawRect:(CGRect)rect { // Drawing code } */ -(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { NSUInteger numItemsHorizontal = [self collectionView:collectionView numberOfItemsInSection:indexPath.section]; if (_itemsVisibleAtOnce < numItemsHorizontal) { numItemsHorizontal = _itemsVisibleAtOnce; } CGFloat itemWidth = collectionView.bounds.size.width / numItemsHorizontal; return CGSizeMake(itemWidth, 30); } -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { return 1; } -(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section { return 0; } -(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section { return 0; } -(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { OSButtonBarItem* button = _buttons[indexPath.row]; OSButtonBarCell* cell = [collectionView dequeueReusableCellWithReuseIdentifier:REUSUE_OS_TAB_CELL forIndexPath:indexPath]; // cell.translatesAutoresizingMaskIntoConstraints = NO; cell.contentView.translatesAutoresizingMaskIntoConstraints = NO; cell.indexPath = indexPath; cell.titleLabel.text = button.text; cell.backgroundColor = button.backgroundColour; return cell; } -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return _buttons.count; } 

Si alguien tiene alguna sugerencia sobre lo que podría estar sucediendo, ¡sería muy gratificante!

Muchas gracias Chris