OK, la réponse est non, il n'y a aucun moyen de le faire sans sous-classer UICollectionViewFlowLayout.
Cependant, le sous-classement est incroyablement facile pour quiconque lira ceci à l'avenir.
J'ai d'abord configuré l'appel de sous-classe MyCollectionViewFlowLayout
, puis dans le générateur d'interface, j'ai changé la disposition de la vue de collection sur Personnalisée et sélectionné ma sous-classe de disposition de flux.
Parce que vous le faites de cette façon, vous ne pouvez pas spécifier la taille des éléments, etc ... dans IB donc dans MyCollectionViewFlowLayout.m j'ai ceci ...
- (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);
}
Cela configure toutes les tailles pour moi et la direction de défilement.
Ensuite ...
- (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);
}
Cela garantit que le défilement se termine par une marge de 5,0 sur le bord gauche.
C'est tout ce que j'avais à faire. Je n'avais pas du tout besoin de définir la disposition du flux dans le code.