यहाँ ऊर्ध्वाधर सेल आधारित पेजिंग के लिए स्विफ्ट 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:)
, तो आइटम के साथ कस्टम चर का उपयोग करें।
- जब आप सेट करते हैं तो यह सबसे अच्छा काम करता है
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)
}
यह कोड मेरे व्यक्तिगत प्रोजेक्ट में उपयोग किए गए कोड पर आधारित है, आप इसे डाउनलोड करके और उदाहरण लक्ष्य को चलाकर यहां देख सकते हैं ।