diff options
| -rw-r--r-- | Sora/Views/InteractiveImageView.swift | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/Sora/Views/InteractiveImageView.swift b/Sora/Views/InteractiveImageView.swift index 7afde7d..a36d34f 100644 --- a/Sora/Views/InteractiveImageView.swift +++ b/Sora/Views/InteractiveImageView.swift @@ -8,6 +8,7 @@ struct InteractiveImageView: View { @State private var previousScale = 0.0 @State private var currentOffset: CGSize = .zero @State private var previousOffset: CGSize = .zero + @State private var zoomAnchor: UnitPoint = .center var body: some View { GeometryReader { geometry in @@ -15,7 +16,7 @@ struct InteractiveImageView: View { image .resizable() .scaledToFit() - .scaleEffect(currentScale) + .scaleEffect(currentScale, anchor: zoomAnchor) .offset(currentOffset) .frame(width: screenWidth, height: screenHeight) .clipped() @@ -23,6 +24,10 @@ struct InteractiveImageView: View { MagnifyGesture() .onChanged { gesture in withAnimation(.interactiveSpring()) { + if previousScale == 0 { + zoomAnchor = gesture.startAnchor + } + currentScale = previousScale + gesture.magnification - (previousScale == 0 ? 0 : 1) } @@ -52,10 +57,11 @@ struct InteractiveImageView: View { TapGesture(count: 2) .onEnded { withAnimation { - currentScale = 1.0 + currentScale = 1 previousScale = 0 currentOffset = .zero previousOffset = .zero + zoomAnchor = .center } } ) |