#xcode10 #ios12 #swift4.2 #ios-pdfkit
#xcode10 #ios12 #swift4.2 #ios-pdfkit
Вопрос:
В моем приложении есть несколько PDF-файлов, и я использую PDFKit в swift. Теперь я хочу выделить все гиперссылки в документе pdf. Я пытался использовать PDFAnnotationSubtype.highlight и PDFAnnotationSubtype.link, но в обоих случаях я не смог достичь своей цели.
Для PDFAnnotationSubtype.highlight — при нажатии на ссылки я не смог добавить к ней действие.
Для PDFAnnotationSubtype.link — я не смог установить цвет или цвет фона для ссылок.
Вот мой код, пожалуйста, поправьте меня, если я чего-то здесь не хватает.
//here i get my pdf from document directory
let filePAth = (self.getDirectoryPath() as NSString).appendingPathComponent(webURLString)
let fileURL = URL(fileURLWithPath: filePAth)
let document = PDFDocument(url: fileURL)
self.pdfView.displayMode = .twoUpContinuous
self.pdfView.displayDirection = .horizontal
pdfView.usePageViewController(true, withViewOptions: [UIPageViewController.OptionsKey.interPageSpacing: 0])
//here is the hack
//i am getting annotation
let count = document?.pageCount
for i in 0 ..< count! {
let page = document?.page(at: i)
let annotationArray = page1?.annotations
for annotationObj in annotationArray! {
if annotationObj.type! == "Link" {
//case 1: highlights hyperlinks links but
//added action does not work
let annotation = PDFAnnotation(bounds: obj.bounds, forType: PDFAnnotationSubtype.highlight, withProperties: nil)
annotation.color = UIColor.red
annotation.isHighlighted = true
// highlights all the hyperlinks with red color
// but added action does not work here
let url = URL(string: "http://google.com/")
annotation.action = PDFActionURL(url: url!)
page?.addAnnotation(annotation)
//case 2: does not highlights hyperlinks links with red
//color but added action works
let annotation = PDFAnnotation(bounds: obj.bounds, forType: PDFAnnotationSubtype.link, withProperties: nil)
// no effect
annotation.color = UIColor.red
annotation.isHighlighted = true
// does not highlight all the hyperlinks with red
// but added action works here
let url = URL(string: "http://google.com/")
annotation.action = PDFActionURL(url: url!)
page?.addAnnotation(annotation)
}
}
}
Я могу найти способ. кто-нибудь может что-нибудь предложить?
Изображение является результатом случая 1, упомянутого в коде.
Ответ №1:
Даже это неправильное решение, хотя это и взлом.
Шаг 1 — Создайте аннотацию ссылки и добавьте существующее действие аннотации к новой аннотации ссылки.
let linkAnnotation = PDFAnnotation(bounds: obj.bounds, forType: PDFAnnotationSubtype.link, withProperties: nil)
linkAnnotation.action = obj.annotation
Шаг 2 — Добавьте новую аннотацию ссылки на страницу после выделенной вами аннотации.
page?.addAnnotation(linkAnnotation)
Попробуйте и дайте мне знать, работает ли это у вас.
Ответ №2:
Вам не нужно добавлять какое-либо действие к аннотации, вы можете получить его бесплатно, добавив notification observe, потому что PDFKit отправит уведомление с именем ‘PDFViewAnnotationHit’ при нажатии на аннотацию. Вот документация Apple
func addAnnotationNotification() {
NotificationCenter.default.addObserver(
self,
selector: #selector(annotationHit(notification:)),
name: Notification.Name.PDFViewAnnotationHit, object: nil
)
}
@objc func annotationHit(notification: Notification) {
if let annotation = notification.userInfo?["PDFAnnotationHit"] as? PDFAnnotation {
print(annotation.bounds)
print(annotation.contents!)
}
}