OK, Antwort ist nein, es gibt keine Möglichkeit, dies zu tun, ohne UICollectionViewFlowLayout zu unterklassifizieren.
Das Unterklassen ist jedoch für jeden, der dies in Zukunft liest, unglaublich einfach.
Zuerst habe ich den Unterklassenaufruf eingerichtet MyCollectionViewFlowLayout
und dann im Interface Builder das Layout der Sammlungsansicht in Benutzerdefiniert geändert und meine Unterklasse für das Flusslayout ausgewählt.
Da Sie dies auf diese Weise tun, können Sie in IB keine Artikelgrößen usw. angeben. In MyCollectionViewFlowLayout.m habe ich diese ...
- (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);
}
Dadurch werden alle Größen für mich und die Bildlaufrichtung festgelegt.
Dann ...
- (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);
}
Dies stellt sicher, dass das Scrollen mit einem Rand von 5,0 am linken Rand endet.
Das war alles was ich tun musste. Ich musste das Ablauflayout überhaupt nicht im Code festlegen.