@@ -7,6 +7,8 @@ class PagerScrollDelegate: NSObject, UIScrollViewDelegate, UICollectionViewDeleg
77 weak var originalDelegate : UICollectionViewDelegate ?
88 weak var delegate : PagerViewProviderDelegate ?
99 var orientation : UICollectionView . ScrollDirection = . horizontal
10+ var lastSelectedPage : Int = - 1
11+ var isProgrammaticScroll : Bool = false
1012
1113 private let handledSelectors : Set < Selector > = [
1214 #selector( scrollViewDidScroll ( _: ) ) ,
@@ -45,21 +47,45 @@ class PagerScrollDelegate: NSObject, UIScrollViewDelegate, UICollectionViewDeleg
4547 }
4648
4749 func scrollViewDidEndDecelerating( _ scrollView: UIScrollView ) {
50+ emitPageSelectedIfNeeded ( scrollView)
4851 delegate? . onPageScrollStateChanged ( state: . idle)
4952 originalDelegate? . scrollViewDidEndDecelerating ? ( scrollView)
5053 }
51-
54+
5255 func scrollViewDidEndScrollingAnimation( _ scrollView: UIScrollView ) {
56+ emitPageSelectedIfNeeded ( scrollView)
5357 delegate? . onPageScrollStateChanged ( state: . idle)
5458 originalDelegate? . scrollViewDidEndScrollingAnimation ? ( scrollView)
5559 }
56-
60+
5761 func scrollViewDidEndDragging( _ scrollView: UIScrollView , willDecelerate decelerate: Bool ) {
5862 if !decelerate {
63+ emitPageSelectedIfNeeded ( scrollView)
5964 delegate? . onPageScrollStateChanged ( state: . idle)
6065 }
6166 originalDelegate? . scrollViewDidEndDragging ? ( scrollView, willDecelerate: decelerate)
6267 }
68+
69+ private func emitPageSelectedIfNeeded( _ scrollView: UIScrollView ) {
70+ // Skip during programmatic navigation — .onChange handles that
71+ if isProgrammaticScroll {
72+ isProgrammaticScroll = false
73+ return
74+ }
75+
76+ let isHorizontal = orientation == . horizontal
77+ let pageSize = isHorizontal ? scrollView. frame. width : scrollView. frame. height
78+ let contentOffset = isHorizontal ? scrollView. contentOffset. x : scrollView. contentOffset. y
79+
80+ guard pageSize > 0 else { return }
81+
82+ let page = Int ( round ( contentOffset / pageSize) )
83+
84+ if page != lastSelectedPage {
85+ lastSelectedPage = page
86+ delegate? . onPageSelected ( position: page)
87+ }
88+ }
6389
6490 func collectionView( _ collectionView: UICollectionView , didEndDisplaying cell: UICollectionViewCell , forItemAt indexPath: IndexPath ) {
6591 originalDelegate? . collectionView ? ( collectionView, didEndDisplaying: cell, forItemAt: indexPath)
0 commit comments