You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何重新运行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:29:54