Bien, la respuesta es no, no hay manera de hacer esto sin subclasificar UICollectionViewFlowLayout.
Sin embargo, subclasificarlo es increíblemente fácil para cualquiera que lea esto en el futuro.
Primero configuré la llamada de subclase MyCollectionViewFlowLayout
y luego en el generador de interfaz cambié el diseño de la vista de colección a Personalizado y seleccioné mi subclase de diseño de flujo.
Debido a que lo está haciendo de esta manera, no puede especificar tamaños de elementos, etc.en IB, así que en MyCollectionViewFlowLayout.m tengo esto ...
- (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);
}
Esto configura todos los tamaños para mí y la dirección de desplazamiento.
Luego ...
- (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);
}
Esto asegura que el desplazamiento finalice con un margen de 5,0 en el borde izquierdo.
Eso es todo lo que necesitaba hacer. No necesitaba establecer el diseño de flujo en código en absoluto.