SwiftUI:捏合以放大图像

ntr*_*pin 5 ios swift swiftui

我想允许用户在 SwiftUI 中捏合放大图像。我想最好的方法是使用 a MagnificationGesture,然后按照这里的答案,我最终得到了这个代码:

// outside of `var body: some View`
@State private var scale: Int = 1.0
@State private var lastScale: Int = 1.0

// Image 
Image("dog")
.resizable()
.aspectRatio(contentMode: .fit)
.gesture(MagnificationGesture()
    .onChanged { val in
        let delta = val / self.lastScale
        self.lastScale = val
        let newScale = self.scale * delta
        self.scale = newScale
    }
    .onEnded { _ in
        self.lastScale = 1.0
    }
)
.scaleEffect(scale)
Run Code Online (Sandbox Code Playgroud)

此代码可以很好地处理放大,但不允许用户放大特定区域。相反,它总是放大图像的中间。

我将如何处理 SwiftUI 中图像的双指缩放行为?

提前致谢!

小智 2

我发现最简单的实现方法是使用Apple提供的PDFKit。

1.首先创建PDFView

    import SwiftUI
    import PDFKit

    struct PhotoDetailView: UIViewRepresentable {
    let image: UIImage
    func makeUIView(context: Context) -> PDFView {
        let view = PDFView()
        view.document = PDFDocument()
        guard let page = PDFPage(image: image) else { return view }
        view.document?.insert(page, at: 0)
        view.autoScales = true
        view.backgroundColor = .clear
        return view
    }
    
    func updateUIView(_ uiView: PDFView, context: Context) {
        
    }
    }
Run Code Online (Sandbox Code Playgroud)

2.在swiftUI视图中使用,像这样

TabView(selection: $index,
                content:  {
                //this line
                PhotoDetailView(image: images[index])
                    .offset(imageViewerOffset)
                
        })
        .tabViewStyle(PageTabViewStyle(indexDisplayMode: .always))
Run Code Online (Sandbox Code Playgroud)