OK, a resposta é não, não há como fazer isso sem subclassificar UICollectionViewFlowLayout.
No entanto, a criação de subclasses é incrivelmente fácil para qualquer um que esteja lendo isso no futuro.
Primeiro, configurei a chamada da subclasse MyCollectionViewFlowLayout
e, em seguida, no construtor de interface, alterei o layout de visualização da coleção para Customizado e selecionei minha subclasse de layout de fluxo.
Porque você está fazendo isso desta forma, você não pode especificar tamanhos de itens, etc ... em IB, então em MyCollectionViewFlowLayout.m eu tenho isso ...
- (void)awakeFromNib
{
self.itemSize = CGSizeMake(75.0, 75.0);
self.minimumInteritemSpacing = 10.0;
self.minimumLineSpacing = 10.0;
self.scrollDirection = UICollectionViewScrollDirectionHorizontal;
self.sectionInset = UIEdgeInsetsMake(10.0, 10.0, 10.0, 10.0);
}
Isso configura todos os tamanhos para mim e a direção da rolagem.
Então ...
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity
{
CGFloat offsetAdjustment = MAXFLOAT;
CGFloat horizontalOffset = proposedContentOffset.x + 5;
CGRect targetRect = CGRectMake(proposedContentOffset.x, 0, self.collectionView.bounds.size.width, self.collectionView.bounds.size.height);
NSArray *array = [super layoutAttributesForElementsInRect:targetRect];
for (UICollectionViewLayoutAttributes *layoutAttributes in array) {
CGFloat itemOffset = layoutAttributes.frame.origin.x;
if (ABS(itemOffset - horizontalOffset) < ABS(offsetAdjustment)) {
offsetAdjustment = itemOffset - horizontalOffset;
}
}
return CGPointMake(proposedContentOffset.x + offsetAdjustment, proposedContentOffset.y);
}
Isso garante que a rolagem termine com uma margem de 5,0 na borda esquerda.
Isso é tudo que eu precisava fazer. Não precisei definir o layout do fluxo no código.