OK, la risposta è no, non c'è modo di farlo senza creare una sottoclasse UICollectionViewFlowLayout.
Tuttavia, creare sottoclassi è incredibilmente facile per chiunque legga questo articolo in futuro.
Per prima cosa ho impostato la chiamata della sottoclasse MyCollectionViewFlowLayout
e poi nel generatore di interfacce ho cambiato il layout della vista della raccolta in Personalizzato e ho selezionato la mia sottoclasse del layout di flusso.
Poiché lo stai facendo in questo modo, non puoi specificare le dimensioni degli elementi, ecc ... in IB quindi in MyCollectionViewFlowLayout.m ho questo ...
- (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);
}
Questo imposta tutte le dimensioni per me e la direzione di scorrimento.
Poi ...
- (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);
}
Ciò garantisce che lo scorrimento termini con un margine di 5,0 sul bordo sinistro.
È tutto quello che dovevo fare. Non avevo affatto bisogno di impostare il layout del flusso nel codice.