OK, la réponse est non, il n'y a aucun moyen de le faire sans sous-classer UICollectionViewFlowLayout.
Cependant, la sous-classe est incroyablement facile pour tous ceux qui liront ceci à l'avenir.
J'ai d'abord configuré l'appel de la sous-classe MyCollectionViewFlowLayout
puis, dans le constructeur d'interface, j'ai changé la disposition de la vue de la collection en Personnalisée et j'ai sélectionné ma sous-classe de disposition de flux.
Parce que vous procédez de cette manière, vous ne pouvez pas spécifier les tailles des éléments, etc... dans IB. Ainsi, 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 du défilement.
Alors...
- (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 avec une marge de 5.0 sur le bord gauche.
C'est tout ce que j'avais à faire. Je n'ai pas eu besoin de définir la disposition du flux dans le code du tout.