นี่คือการใช้งานของฉันในSwift 5สำหรับการเพจตามเซลล์แนวตั้ง :
override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
guard let collectionView = self.collectionView else {
let latestOffset = super.targetContentOffset(forProposedContentOffset: proposedContentOffset, withScrollingVelocity: velocity)
return latestOffset
}
// Page height used for estimating and calculating paging.
let pageHeight = self.itemSize.height + self.minimumLineSpacing
// Make an estimation of the current page position.
let approximatePage = collectionView.contentOffset.y/pageHeight
// Determine the current page based on velocity.
let currentPage = velocity.y == 0 ? round(approximatePage) : (velocity.y < 0.0 ? floor(approximatePage) : ceil(approximatePage))
// Create custom flickVelocity.
let flickVelocity = velocity.y * 0.3
// Check how many pages the user flicked, if <= 1 then flickedPages should return 0.
let flickedPages = (abs(round(flickVelocity)) <= 1) ? 0 : round(flickVelocity)
let newVerticalOffset = ((currentPage + flickedPages) * pageHeight) - collectionView.contentInset.top
return CGPoint(x: proposedContentOffset.x, y: newVerticalOffset)
}
หมายเหตุบางประการ:
- ไม่ผิดพลาด
- ตั้งค่าเพจให้เป็นเท็จ ! (มิฉะนั้นจะใช้ไม่ได้)
- ช่วยให้คุณตั้งค่าการสะบัดของคุณเองได้อย่างง่ายดาย
- หากบางอย่างยังใช้งานไม่ได้หลังจากลองทำสิ่งนี้ให้ตรวจสอบว่าของคุณ
itemSize
ตรงกับขนาดของรายการจริงหรือไม่ซึ่งมักจะเป็นปัญหาโดยเฉพาะเมื่อใช้collectionView(_:layout:sizeForItemAt:)
ให้ใช้ตัวแปรที่กำหนดเองกับ itemSize แทน
self.collectionView.decelerationRate = UIScrollView.DecelerationRate.fast
นี้ทำงานได้ดีที่สุดเมื่อคุณตั้งค่า
นี่คือเวอร์ชันแนวนอน (ยังไม่ได้ทดสอบอย่างละเอียดดังนั้นโปรดยกโทษให้กับความผิดพลาด):
override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
guard let collectionView = self.collectionView else {
let latestOffset = super.targetContentOffset(forProposedContentOffset: proposedContentOffset, withScrollingVelocity: velocity)
return latestOffset
}
// Page width used for estimating and calculating paging.
let pageWidth = self.itemSize.width + self.minimumInteritemSpacing
// Make an estimation of the current page position.
let approximatePage = collectionView.contentOffset.x/pageWidth
// Determine the current page based on velocity.
let currentPage = velocity.x == 0 ? round(approximatePage) : (velocity.x < 0.0 ? floor(approximatePage) : ceil(approximatePage))
// Create custom flickVelocity.
let flickVelocity = velocity.x * 0.3
// Check how many pages the user flicked, if <= 1 then flickedPages should return 0.
let flickedPages = (abs(round(flickVelocity)) <= 1) ? 0 : round(flickVelocity)
// Calculate newHorizontalOffset.
let newHorizontalOffset = ((currentPage + flickedPages) * pageWidth) - collectionView.contentInset.left
return CGPoint(x: newHorizontalOffset, y: proposedContentOffset.y)
}
รหัสนี้อ้างอิงจากรหัสที่ฉันใช้ในโครงการส่วนตัวของฉันคุณสามารถตรวจสอบได้ที่นี่โดยดาวน์โหลดและเรียกใช้เป้าหมายตัวอย่าง