Skip to content

Commit 47a56c5

Browse files
authored
fix(mobile): reduce timeline indicator jank on iOS (#4857)
1 parent d9a426b commit 47a56c5

File tree

3 files changed

+28
-5
lines changed

3 files changed

+28
-5
lines changed

apps/mobile/native/ios/Modules/PagerView/EnhancePagerController.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@ class EnhancePagerController: UIPageViewController, UIScrollViewDelegate {
114114

115115
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
116116
startOffset = scrollView.contentOffset.x
117-
debugPrint(scrollView.contentOffset.x)
118117
isDragging = true
119118
onScrollStart?(currentPageIndex)
120119
}
@@ -128,12 +127,14 @@ class EnhancePagerController: UIPageViewController, UIScrollViewDelegate {
128127
direction = .left
129128
}
130129

130+
guard view.frame.width > 0 else { return }
131131
let positionFromStartOfCurrentPage = abs(startOffset - scrollView.contentOffset.x)
132132
let percent = positionFromStartOfCurrentPage / view.frame.width
133133
let position = currentPageIndex
134134

135-
debugPrint(percent, direction, position)
136-
onScroll?(percent, direction, position)
135+
if direction != .none || percent > 0 {
136+
onScroll?(percent, direction, position)
137+
}
137138
}
138139

139140
public func scrollViewDidEndDragging(

apps/mobile/native/ios/Modules/PagerView/EnhancePagerViewModule.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ enum TransitionStyle: String, Enumerable {
6868

6969
private class EnhancePagerView: ExpoView, UIGestureRecognizerDelegate {
7070
fileprivate var pageController: EnhancePagerController?
71+
private var isInitialized = false
7172

7273
private let onScroll = EventDispatcher()
7374
private let onScrollBegin = EventDispatcher()
@@ -104,6 +105,11 @@ private class EnhancePagerView: ExpoView, UIGestureRecognizerDelegate {
104105
var transitionStyle: TransitionStyle = .scroll
105106
var panGestureRecognizer: UIGestureRecognizer?
106107
func initialize() {
108+
if isInitialized {
109+
return
110+
}
111+
isInitialized = true
112+
107113
let panGestureRecognizer = UIPanGestureRecognizer()
108114
panGestureRecognizer.delegate = self
109115
self.panGestureRecognizer = panGestureRecognizer

apps/mobile/src/modules/screen/PagerList.ios.tsx

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ export function PagerList({
3131
)
3232
const [initialPageIndex] = useState(activeViewIndex)
3333
const pagerRef = useRef<PagerRef>(null)
34+
const lastProgressRef = useRef(activeViewIndex)
3435
const rid = useId()
3536
const dragProgress = useTimelineSelectorDragProgress()
3637

@@ -39,11 +40,22 @@ export function PagerList({
3940
if (data.target !== rid) {
4041
const targetIndex = activeViews.indexOf(data.view.viewId)
4142
pagerRef.current?.setPage(targetIndex)
43+
lastProgressRef.current = targetIndex
4244
dragProgress.set(withTiming(targetIndex))
4345
}
4446
})
4547
}, [activeViews, dragProgress, pagerRef, rid])
4648
const [dragging, setDragging] = useState(false)
49+
const updateDragProgress = useCallback(
50+
(nextProgress: number) => {
51+
if (Math.abs(nextProgress - lastProgressRef.current) < 0.001) {
52+
return
53+
}
54+
lastProgressRef.current = nextProgress
55+
dragProgress.set(nextProgress)
56+
},
57+
[dragProgress],
58+
)
4759

4860
return (
4961
<PagerView
@@ -56,12 +68,16 @@ export function PagerList({
5668
0,
5769
activeViews.length - 1,
5870
)
59-
dragProgress.set(progress)
71+
updateDragProgress(progress)
6072
}}
61-
onScrollBegin={useCallback(() => setDragging(true), [])}
73+
onScrollBegin={useCallback(() => {
74+
setDragging(true)
75+
lastProgressRef.current = activeViewIndex
76+
}, [activeViewIndex])}
6277
onScrollEnd={useCallback(
6378
(index: number) => {
6479
setDragging(false)
80+
lastProgressRef.current = index
6581
dragProgress.set(withTiming(index))
6682
},
6783
[dragProgress],

0 commit comments

Comments
 (0)