PdfKit突出显示注释

时间:2017-09-29 11:01:52

标签: ios swift pdf pdfkit

我试图在iOS上使用PDFKit为文档添加高亮注释。

let highlight = PDFAnnotation(bounds: selection.bounds(for: page),
                              forType: PDFAnnotationSubtype.highlight,
                              withProperties: nil)

highlight.color = color

page.addAnnotation(highlight)
page.displaysAnnotations = true

使用上面的代码添加它们时,它们显示为两个不同形状的图层。将它们保存到PDF文件并重新打开时,它们会正确显示。

this screen capture

enter image description here

使用此处提供的代码段以相同的方式添加了顶部和底部精彩片段。最上面的一个已保存到pdf文档中,并在重新打开时按预期显示,最后一个刚刚添加。

有没有人知道如何正确显示它们(例如最顶层)而无需保存并重新打开文件?

2 个答案:

答案 0 :(得分:1)

所以这是10.13中的一个已知错误。通过滚动页面然后返回突出显示

,有一种解决方法

您可以使用以下代码创建突出显示:

let page = self.pdfDocument?.page(at: 10)
let bounds = CGRect(x: 85.8660965, y: 786.8891167, width: 298.41, height: 12.1485)
let annotation = PDFAnnotation(bounds: bounds, forType: .highlight, withProperties: nil)
annotation.color = NSColor.blue
page?.addAnnotation(annotation)

然后您需要滚动页面并返回突出显示

func annotationScrollHack(page: PDFPage) {
    guard let pdfDocument = self.pdfDocument else { return }

    //When adding highlights to macOS 10.13 it seems like 2 highlights are added.
    //If you scroll to a different page and back the "extra" highlight is removed
    //This function scrolls to the first/last page in the book and then back to the current page
    //rdar://34784917
    let bookScrollView = self.pdfView.documentView?.enclosingScrollView
    let currentVisibleRect = bookScrollView?.contentView.documentVisibleRect
    if (0 ... 3).contains(pdfDocument.index(for: page)) {
        if self.pdfView.canGoToLastPage {
            self.pdfView.goToLastPage(self)
        }
    } else {
        if self.pdfView.canGoToFirstPage {
            self.pdfView.goToFirstPage(self)
        }
    }

    if let currentVisibleRect = currentVisibleRect {
        bookScrollView?.contentView.scroll(to: CGPoint(x: currentVisibleRect.origin.x, y: currentVisibleRect.origin.y))
    }
}

Apple的回复:

  

除了“hack"”之外没有其他解决方法。他们描述:滚动   离开然后回来是最好的选择。更改缩放系数和还原   它可能以同样的方式修复它,但不能保证。

答案 1 :(得分:1)

我最终采用了这种黑客方法,考虑到我认为的所有情况。希望有所帮助。

x = (input("month: "), input("day: "), input("Year: "))