OK, câu trả lời là không, không có cách nào để thực hiện việc này mà không phân lớp UICollectionViewFlowLayout.
Tuy nhiên, việc phân loại nó trở nên vô cùng dễ dàng đối với những ai đang đọc nó trong tương lai.
Đầu tiên, tôi thiết lập lệnh gọi lớp con MyCollectionViewFlowLayout
và sau đó trong trình tạo giao diện, tôi đã thay đổi bố cục dạng xem bộ sưu tập thành Tùy chỉnh và chọn lớp con bố cục luồng của mình.
Bởi vì bạn đang làm theo cách này, bạn không thể chỉ định kích thước mục, v.v. trong IB nên trong MyCollectionViewFlowLayout.m, tôi có cái này ...
- (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);
}
Điều này thiết lập tất cả các kích thước cho tôi và hướng cuộn.
Sau đó ...
- (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);
}
Điều này đảm bảo rằng quá trình cuộn kết thúc với lề 5,0 ở cạnh bên trái.
Đó là tất cả những gì tôi cần làm. Tôi không cần thiết lập bố cục luồng trong mã.