@@ -131,15 +131,18 @@ extension Pager {
131
131
/// Callback invoked when a new page is set
132
132
var onPageChanged : ( ( Int ) -> Void ) ?
133
133
134
- /// Callback for when dragging begins
134
+ /// Callback for a dragging began event
135
135
var onDraggingBegan : ( ( ) -> Void ) ?
136
136
137
- /// Callback for when dragging changes
137
+ /// Callback for a dragging changed event
138
138
var onDraggingChanged : ( ( Double ) -> Void ) ?
139
139
140
- /// Callback for when dragging ends
140
+ /// Callback for a dragging ended event
141
141
var onDraggingEnded : ( ( ) -> Void ) ?
142
142
143
+ /// Callback for a digital crown rotated event
144
+ var onDigitalCrownRotated : ( ( Double ) -> Void ) ?
145
+
143
146
/*** State and Binding properties ***/
144
147
145
148
/// Page index
@@ -155,9 +158,6 @@ extension Pager {
155
158
/// Digital Crown offset
156
159
@State var digitalCrownPageOffset : CGFloat = 0
157
160
158
- /// Digital Crown offset
159
- @State var lastDigitalCrownPageOffset : CGFloat = 0
160
-
161
161
#endif
162
162
163
163
/// Initializes a new `Pager`.
@@ -246,7 +246,7 @@ extension Pager {
246
246
#endif
247
247
248
248
#if os(watchOS)
249
- if #available( watchOSApplicationExtension 7 . 0 , * ) {
249
+ if #available( watchOS 7 . 0 , * ) {
250
250
resultView = resultView
251
251
. focusable ( )
252
252
. digitalCrownRotation (
@@ -257,12 +257,21 @@ extension Pager {
257
257
sensitivity: . low
258
258
)
259
259
. onChange ( of: digitalCrownPageOffset) { newValue in
260
- print ( newValue)
261
- let increment = min ( 1 , max ( - 1 , Int ( newValue - lastDigitalCrownPageOffset) ) )
262
- guard abs ( increment) > 0 else { return }
263
- lastDigitalCrownPageOffset = newValue
264
- withAnimation {
265
- pagerModel. update ( . move( increment: increment) )
260
+ let pageIncrement = min ( 1 , max ( - 1 , Int ( newValue - pagerModel. lastDigitalCrownPageOffset) ) )
261
+ let offset = ( newValue - pagerModel. lastDigitalCrownPageOffset) - CGFloat( pageIncrement)
262
+ onDigitalCrownRotated ? ( newValue * pageDistance)
263
+ let animation = self . draggingAnimation. animation ?? . default
264
+ guard abs ( pageIncrement) > 0 else {
265
+ withAnimation ( animation) {
266
+ pagerModel. draggingOffset = - offset * pageDistance
267
+ pagerModel. objectWillChange. send ( )
268
+ }
269
+ return
270
+ }
271
+ withAnimation ( animation) {
272
+ pagerModel. lastDigitalCrownPageOffset = newValue - offset
273
+ pagerModel. draggingOffset = - offset
274
+ pagerModel. update ( . move( increment: pageIncrement) )
266
275
}
267
276
}
268
277
. eraseToAny ( )
@@ -284,10 +293,12 @@ extension Pager.PagerContent {
284
293
let animation = self . draggingAnimation. animation ?? . default
285
294
switch ( command, isHorizontal) {
286
295
case ( . left, true ) :
296
+ guard !dragForwardOnly else { return }
287
297
withAnimation ( animation) { self . pagerModel. update ( . previous) }
288
298
case ( . right, true ) :
289
299
withAnimation ( animation) { self . pagerModel. update ( . next) }
290
300
case ( . up, false ) :
301
+ guard !dragForwardOnly else { return }
291
302
withAnimation ( animation) { self . pagerModel. update ( . previous) }
292
303
case ( . down, false ) :
293
304
withAnimation ( animation) { self . pagerModel. update ( . next) }
0 commit comments