From b1eb844752e59270594c2b759f3b6ca85e6aa7ee Mon Sep 17 00:00:00 2001 From: fermoya Date: Tue, 5 Apr 2022 13:36:17 +0100 Subject: [PATCH] Add support for watchOS digitalCrown --- Sources/SwiftUIPager/Page.swift | 5 ++++ Sources/SwiftUIPager/PagerContent.swift | 32 +++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/Sources/SwiftUIPager/Page.swift b/Sources/SwiftUIPager/Page.swift index 7ecc402..cda1b39 100644 --- a/Sources/SwiftUIPager/Page.swift +++ b/Sources/SwiftUIPager/Page.swift @@ -80,6 +80,9 @@ extension Page { /// Will move to the first page case moveToFirst + /// Will increment or decrement the `index` by the passed argument + case move(increment: Int) + /// Will move to the last page case moveToLast @@ -116,6 +119,8 @@ extension Page { index = 0 case .moveToLast: index = totalPages - 1 + case .move(let increment): + index += increment case .new(let newIndex): index = newIndex } diff --git a/Sources/SwiftUIPager/PagerContent.swift b/Sources/SwiftUIPager/PagerContent.swift index e51c661..6ebac76 100644 --- a/Sources/SwiftUIPager/PagerContent.swift +++ b/Sources/SwiftUIPager/PagerContent.swift @@ -150,6 +150,16 @@ extension Pager { @GestureState var isGestureFinished = true #endif + #if os(watchOS) + + /// Digital Crown offset + @State var digitalCrownPageOffset: CGFloat = 0 + + /// Digital Crown offset + @State var lastDigitalCrownPageOffset: CGFloat = 0 + + #endif + /// Initializes a new `Pager`. /// /// - Parameter size: Available size @@ -235,6 +245,28 @@ extension Pager { } #endif + #if os(watchOS) + resultView = resultView + .focusable() + .digitalCrownRotation( + $digitalCrownPageOffset, + from: 0, + through: CGFloat(numberOfPages - 1), + by: 1, + sensitivity: .low + ) + .onChange(of: digitalCrownPageOffset) { newValue in + print(newValue) + let increment = min(1, max(-1, Int(newValue - lastDigitalCrownPageOffset))) + guard abs(increment) > 0 else { return } + lastDigitalCrownPageOffset = newValue + withAnimation { + pagerModel.update(.move(increment: increment)) + } + } + .eraseToAny() + #endif + return resultView.contentShape(Rectangle()) } }