如何重新运行PDFPageOverlayViewProvider的overlayView生成方法?
手动触发PDFPageOverlayViewProvider的覆盖视图更新
要手动触发pdfView(_:overlayViewFor:)方法重新执行以更新PDF页面的覆盖视图,核心思路是让PDFView重新加载页面的覆盖视图逻辑,具体实现步骤如下:
1. 添加触发刷新的绑定变量
在PDFKitRepresentableView结构体中添加一个@Binding类型的变量,作为刷新触发的信号:
struct PDFKitRepresentableView: UIViewRepresentable { let bookId: UUID @Binding var selectedNote: [SelectedNote] @Binding var shouldRefreshOverlays: Bool // 新增刷新触发变量 let pdfDocument: PDFDocument let pdfView = PDFView() let toolPicker = PKToolPicker() let setIndex: (String) -> Void // 原有的其他方法... }
2. 在updateUIView中处理刷新逻辑
在updateUIView方法中检测shouldRefreshOverlays的变化,当它为true时,重置pageOverlayViewProvider,迫使PDFView重新调用pdfView(_:overlayViewFor:)生成新的覆盖视图:
func updateUIView(_ uiView: PDFView, context: Context) { let savedDestination = uiView.currentPage // 原有的toolPicker显示逻辑 if let localNote = selectedNote.first(where: {$0.noteId == bookId.uuidString}), !localNote.selected { toolPicker.setVisible(false, forFirstResponder: uiView) } else { toolPicker.setVisible(true, forFirstResponder: uiView) } // 新增刷新逻辑 if shouldRefreshOverlays { // 先置空provider再重新赋值,触发覆盖视图重建 uiView.pageOverlayViewProvider = nil uiView.pageOverlayViewProvider = context.coordinator // 重置触发标志,避免重复刷新 shouldRefreshOverlays = false } uiView.document = uiView.document uiView.layoutDocumentView() uiView.setNeedsDisplay() }
3. 按钮点击触发刷新
在包含PDFKitRepresentableView的父视图中,将shouldRefreshOverlays绑定到按钮的点击事件,点击时将其设为true即可触发更新:
// 示例父视图 struct PDFReaderView: View { @State private var shouldRefresh = false // 其他属性... var body: some View { VStack { Button("刷新覆盖视图") { shouldRefresh = true } PDFKitRepresentableView( bookId: yourBookId, selectedNote: $yourSelectedNotes, shouldRefreshOverlays: $shouldRefresh, // 绑定刷新变量 pdfDocument: yourPDFDocument, setIndex: yourSetIndexHandler ) } } }
补充说明
- 重置
pageOverlayViewProvider是最直接有效的方式,PDFView会在provider变更时,自动为所有可见页面重新调用pdfView(_:overlayViewFor:)生成新的覆盖视图。 - 如果仅需刷新当前页面,可针对性获取当前页面的
PDFPageView并调用setNeedsLayout()或setNeedsDisplay(),但重置provider的方式更通用,能覆盖所有页面的刷新需求。
内容的提问来源于stack exchange,提问作者sol
相关产品推荐
相关产品推荐

