Pkcanvasview, созданный PdfpageOverlayViewProvider.IOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Pkcanvasview, созданный PdfpageOverlayViewProvider.

Сообщение Anonymous »

, установив цвет фона pkcanvasview для синего, я могу сказать, что pkcanvasview для каждого pdfpage создается нормально, но он не отвечает на прикосновение. В частности, будь то пальцем или Applepencil, все ответы страницы происходят из PDFVIEW (например, Zoom и Scrill), а PKCanvasview не может рисовать, пожалуйста, как решить? < /P>
struct PDFContentView: UIViewControllerRepresentable {
let file: FileItem
@Binding var selectedPage: Int
@Binding var currentMode: Mode
@Binding var latestPdfChatResponse: LatestPDFChatResponse
@Binding var drawDataList: [DrawDataItem]

@ObservedObject var userMessage: ChatMessage
@EnvironmentObject var userSettings: UserSettings

func makeUIViewController(context: Context) -> PDFAnnotatableViewController {
let controller = PDFAnnotatableViewController(
file: file,
userSettings: userSettings,
drawDataList: $drawDataList,
selectedPage: $selectedPage,
currentMode: $currentMode,
latestPdfChatResponse: $latestPdfChatResponse,
userMessage: userMessage
)
return controller
}

func updateUIViewController(_ uiViewController: PDFAnnotatableViewController, context: Context) {
uiViewController.goToPage(selectedPage: selectedPage-1)
uiViewController.togglecurrentMode(currentMode: currentMode)
}
}

class PDFAnnotatableViewController: UIViewController, PDFViewDelegate {
private let pdfView = PDFView()
private var pdfDocument: PDFDocument?

let file: FileItem
private var userSettings: UserSettings
@Binding var selectedPage: Int
@Binding var currentMode: Mode
@Binding var latestPdfChatResponse: LatestPDFChatResponse
@State private var pdfPageCoordinator = PDFPageCoordinator()
@ObservedObject var userMessage: ChatMessage

init(file: FileItem,
userSettings: UserSettings,
drawDataList: Binding,
selectedPage: Binding,
currentMode: Binding,
latestPdfChatResponse: Binding,
userMessage: ChatMessage) {

self.file = file
self.userSettings = userSettings
self._selectedPage = selectedPage
self._currentMode = currentMode
self._latestPdfChatResponse = latestPdfChatResponse
self.userMessage = userMessage
super.init(nibName: nil, bundle: nil)

DispatchQueue.global(qos: .userInitiated).async {
if let document = PDFDocument(url: file.pdfLocalUrl) {
DispatchQueue.main.async {
self.pdfDocument = document
self.pdfView.document = document
self.goToPage(selectedPage: selectedPage.wrappedValue - 1)
}
} else {
print("❌ PDF 文档加载失败")
}
}
}

required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func viewDidLoad() {
super.viewDidLoad()
setupPDFView()
}

// MARK: - PDF
private func setupPDFView() {
pdfView.delegate = self
pdfView.autoScales = true
pdfView.displayMode = .singlePage
pdfView.displayDirection = .vertical
pdfView.backgroundColor = .white
pdfView.usePageViewController(true)
pdfView.displaysPageBreaks = false
pdfView.displaysAsBook = false
pdfView.minScaleFactor = 0.8
pdfView.maxScaleFactor = 3.5
pdfView.pageOverlayViewProvider = pdfPageCoordinator

if let document = pdfDocument {
pdfView.document = document
goToPage(selectedPage: selectedPage)
}

pdfView.frame = view.bounds
pdfView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
view.addSubview(pdfView)

NotificationCenter.default.addObserver(
self,
selector: #selector(handlePageChange),
name: .PDFViewPageChanged,
object: pdfView
)
}

// Dealing with page turning
@objc private func handlePageChange(notification: Notification) {
guard let currentPage = pdfView.currentPage, let document = pdfView.document else { return }
let currentPageIndex = document.index(for: currentPage)

if currentPageIndex != selectedPage - 1 {
DispatchQueue.main.async {
self.selectedPage = currentPageIndex + 1
}
}
}

func goToPage(selectedPage: Int) {
guard let document = pdfView.document else { return }
if let page = document.page(at: selectedPage) {
pdfView.go(to: page)
}
}

// Switch function
func togglecurrentMode(currentMode: Mode){
DispatchQueue.main.async {

if self.currentMode == .none{
self.pdfView.usePageViewController(true)
self.pdfView.isUserInteractionEnabled = true
} else if self.currentMode == .annotation {
if let page = self.pdfView.currentPage {
if let canvasView = self.pdfPageCoordinator.getCanvasView(forPage: page) {
canvasView.isUserInteractionEnabled = true
canvasView.tool = PKInkingTool(.pen, color: .red, width: 20) // 设置绘画工具
canvasView.drawingPolicy = .anyInput // 支持所有输入,包括 Apple Pencil
canvasView.setNeedsDisplay()
}
}
}
}
}
}

class MyPDFPage: PDFPage {
var drawing: PKDrawing?

func setDrawing(_ drawing: PKDrawing) {
self.drawing = drawing
}

func getDrawing() -> PKDrawing? {
return self.drawing
}
}

class PDFPageCoordinator: NSObject, PDFPageOverlayViewProvider {

var pageToViewMapping = [PDFPage: PKCanvasView]()

func pdfView(_ view: PDFView, overlayViewFor page: PDFPage) -> UIView? {
var resultView: PKCanvasView? = nil

if let overlayView = pageToViewMapping[page] {
resultView = overlayView
} else {
let canvasView = PKCanvasView(frame: view.bounds)
canvasView.drawingPolicy = .anyInput
canvasView.tool = PKInkingTool(.pen, color: .systemYellow, width: 20)
canvasView.backgroundColor = .blue
pageToViewMapping[page] = canvasView
resultView = canvasView
}

if let page = page as? MyPDFPage, let drawing = page.drawing {
resultView?.drawing = drawing
}
return resultView
}

func pdfView(_ pdfView: PDFView, willEndDisplayingOverlayView overlayView: UIView, for page: PDFPage) {
guard let overlayView = overlayView as? PKCanvasView, let page = page as? MyPDFPage else { return }
page.drawing = overlayView.drawing
pageToViewMapping.removeValue(forKey: page)
}

func savePDFDocument(_ pdfDocument: PDFDocument) -> Data {
for i in 0..
if let page = pdfDocument.page(at: i) as? MyPDFPage, let drawing = page.drawing {

let newAnnotation = PDFAnnotation(bounds: drawing.bounds, forType: .stamp, withProperties: nil)
let codedData = try! NSKeyedArchiver.archivedData(withRootObject: drawing, requiringSecureCoding: true)
newAnnotation.setValue(codedData, forAnnotationKey: PDFAnnotationKey(rawValue: "drawingData"))
page.addAnnotation(newAnnotation)
}
}

let options = [PDFDocumentWriteOption.burnInAnnotationsOption: true]
if let resultData = pdfDocument.dataRepresentation(options: options) {
return resultData
}

return Data()
}
func getCanvasView(forPage page: PDFPage) -> PKCanvasView? {
return pageToViewMapping[page]
}
}
< /code>
Есть ли ошибка в моем коде? Расскажите, пожалуйста, как делать картину Pkcanvasview нормально?


Подробнее здесь: https://stackoverflow.com/questions/794 ... k-normally
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как создать бесконечность PKCanvasView
    Гость » » в форуме IOS
    0 Ответы
    28 Просмотры
    Последнее сообщение Гость
  • PKCanvasView увеличивает размер содержимого во всех направлениях (бесконечный холст)
    Anonymous » » в форуме IOS
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous
  • Swift AutoLayout — PKCanvasView contentSize
    Anonymous » » в форуме IOS
    0 Ответы
    38 Просмотры
    Последнее сообщение Anonymous
  • Удалить UIEditMenuInteraction из PKCanvasView
    Anonymous » » в форуме IOS
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Удалить UIEditMenuInteraction из PKCanvasView
    Anonymous » » в форуме IOS
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous

Вернуться в «IOS»