Гаразд, відповідь - ні, немає способу зробити це без підкласифікації UICollectionViewFlowLayout.
Однак підкласифікувати це неймовірно просто для тих, хто читає це в майбутньому.
Спочатку я встановив виклик підкласу, MyCollectionViewFlowLayout
а потім у конструкторі інтерфейсів я змінив макет подання колекції на Custom та вибрав підклас макета потоку.
Тому що ви робите це таким чином, ви не можете вказати розміри предметів тощо ... в IB, тому в MyCollectionViewFlowLayout.m у мене це ...
- (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);
}
Це встановлює для мене всі розміри та напрямок прокрутки.
Тоді ...
- (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);
}
Це гарантує, що прокрутка закінчується з лівою крайкою 5,0 у полі.
Це все, що мені потрібно було зробити. Мені зовсім не потрібно було встановлювати макет потоку в коді.