swift - PDFKit 的scaleFactorForSizeToFit 无法在 SwiftUI (UIViewRepresentable) 中设置缩放

标签 swift swiftui zooming pdfkit apple-pdfkit

我正在开发一个使用 PDFKit 显示 PDF 的应用程序,并且我需要能够设置最小缩放级别 - 否则用户只能永远缩小。我尝试设置 minScaleFactormaxScaleFactor,由于它们关闭 autoScales,我需要设置 scaleFactor > 到 pdfView.scaleFactorForSizeToFit。但是,此设置不会产生与 autoScales 相同的开始缩放,并且尽管更改了实际的 scaleFactor 数字,但开始缩放并没有改变。这张照片启用了 autoScales: [![打开自动缩放功能的图像][1]][1]

然后当我使用scaleFactorForSizeToFit时会发生什么: [![带有scaleFactorForSizeToFit的图像][2]][2]

引用苹果文档中的scaleFactorForSizeToFit,这是

"size to fit" scale factor that autoScales would use for scaling the current document and layout.

我已将代码粘贴在下面。感谢您的帮助。

import PDFKit
import SwiftUI
import Combine

class DataLoader : ObservableObject {
    @Published var data : Data?
    var cancellable : AnyCancellable?
    
    func loadUrl(url: URL) {
        cancellable = URLSession.shared.dataTaskPublisher(for: url)
            .map { $0.data }
            .receive(on: RunLoop.main)
            .sink(receiveCompletion: { (completion) in
                switch completion {
                case .failure(let failureType):
                    print(failureType)
                    //handle potential errors here
                case .finished:
                    break
                }
        }, receiveValue: { (data) in
            self.data = data
        })
    }
}

struct PDFSwiftUIView : View {
    @StateObject private var dataLoader = DataLoader()
    var StringToBeLoaded: String
    
    var body: some View {
        VStack {
            if let data = dataLoader.data {
                PDFRepresentedView(data: data)
                    .navigationBarHidden(false)
            } else {
                CustomProgressView()
                   //.navigationBarHidden(true)
            }
        }.onAppear {
            dataLoader.loadUrl(url: URL(string: StringToBeLoaded)!)
        }
    }
}

struct PDFRepresentedView: UIViewRepresentable {
    typealias UIViewType = PDFView
    
    let data: Data
    let singlePage: Bool = false
    
    func makeUIView(context _: UIViewRepresentableContext<PDFRepresentedView>) -> UIViewType {
        let pdfView = PDFView()
        
        
     
       // pdfView.autoScales = true
       // pdfView.maxScaleFactor = 0.1
      
        pdfView.minScaleFactor = 1
        pdfView.scaleFactor = pdfView.scaleFactorForSizeToFit
        pdfView.maxScaleFactor = 10
        
       
        if singlePage {
            pdfView.displayMode = .singlePage
        }
        return pdfView
    }
    
    func updateUIView(_ pdfView: UIViewType, context: UIViewRepresentableContext<PDFRepresentedView>) {
        pdfView.document = PDFDocument(data: data)
    }
    func canZoomIn() -> Bool {
           return false
       }
}


struct ContentV_Previews: PreviewProvider {
    static var previews: some View {
        PDFSwiftUIView(StringToBeLoaded: "EXAMPLE_STRING")
            .previewInterfaceOrientation(.portrait)
    }
}

最佳答案

可能和顺序有关。这似乎对我有用:

    pdfView.scaleFactor = pdfView.scaleFactorForSizeToFit
    pdfView.maxScaleFactor = 10.0
    pdfView.minScaleFactor = 1.0
    pdfView.autoScales = true

关于swift - PDFKit 的scaleFactorForSizeToFit 无法在 SwiftUI (UIViewRepresentable) 中设置缩放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72064180/

相关文章:

swift - 是否可以在 SwiftUI 中不使用 navigationView/navigationStack 来创建工具栏项?

java - Android:使用两个 View 进行缩放

html - Wordpress WooSlider 箭头在 100% 时损坏?

d3.js - 如何在 ViewBox 中使用 D3 缩放行为而不是变换

ios - 在 iOS 中运行长任务时加载 "overlay"

ios - 由于 SIGABRT 导致应用程序崩溃

swiftui - 如何从 SwiftUI 中的 NavigationView 中删除搜索栏?

SwiftUI ForEach 数组索引不呈现

swift - 在子类中使用 init

ios - 从模态呈现的 UINavigationVController 导航到根 UINavigationVController - swift