ตกลงคำตอบคือไม่ไม่มีวิธีใดที่จะทำสิ่งนี้ได้หากไม่มีคลาสย่อย UICollectionViewFlowLayout
อย่างไรก็ตามการจัดคลาสย่อยเป็นเรื่องง่ายอย่างไม่น่าเชื่อสำหรับทุกคนที่กำลังอ่านเนื้อหานี้ในอนาคต
ก่อนอื่นฉันตั้งค่าการเรียกคลาสย่อยMyCollectionViewFlowLayout
จากนั้นในตัวสร้างอินเทอร์เฟซฉันเปลี่ยนเค้าโครงมุมมองคอลเลกชันเป็นแบบกำหนดเองและเลือกคลาสย่อยโครงร่างโฟลว์ของฉัน
เนื่องจากคุณทำแบบนี้คุณไม่สามารถระบุขนาดรายการได้ ฯลฯ ... ใน IB ดังนั้นใน MyCollectionViewFlowLayout ฉันมีสิ่งนี้ ...
- (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 ที่ขอบด้านซ้ายมือ
นั่นคือทั้งหมดที่ฉันต้องทำ ฉันไม่จำเป็นต้องตั้งค่าเค้าโครงโฟลว์ในโค้ดเลย