स्विफ्ट पर PDFKit का उपयोग करके एक ईबुक रीडर बनाएं

शुभ दोपहर जैसा कि लेखक ने वादा किया था - मैं आपको "स्विफ्ट में पीडीएफ डाउनलोड, सहेजें और देखें" लेख की निरंतरता प्रस्तुत करता हूं - हम पीडीएफकिट पर एक करीब से नज़र डालेंगे।

PDFKit iOS 11 में दिखाई दिया, और इसमें 3 बेहतरीन विशेषताएं हैं, जिनके बारे में मैं ईबुक रीडर एप्लिकेशन बनाने की प्रक्रिया में बात करना चाहूंगा: पेजिनेशन , डिस्प्ले कंटेंट और पेज आइकन

हर कोई जो दिलचस्पी रखता है, बिल्ली का स्वागत करता है।

छवि

छवि

छवि
पेजिंग, रूपरेखा, और थंबनेल

प्रारंभिक इंजेक्शन के साथ एक PDFViewController बनाना

PDFViewController में URL वैरिएबल बनाते समय, हमने इसे अपरिवर्तनीय बना दिया। यही कारण है कि मैंने प्रॉपर्टी इंजेक्शन या मेथड इंजेक्शन के बजाय इनिशियलज़र इंजेक्शन को चुना।

लागू करने के लिए केवल चर pdfUrl है , और बाकी: दस्तावेज़ और रूपरेखा , स्थानीय वर्ग के दायरे के माध्यम से सुलभ हैं और init () के माध्यम से शुरू किया जा सकता है।

PdfView की सामग्री परिवर्तित नहीं होती है, इसलिए मैंने इसे चर दस्तावेज़ के साथ निर्दिष्ट किया और इसे init () के माध्यम से प्रारंभ किया।

import UIKit import PDFKit class PDFViewController: UIViewController { private let pdfUrl: URL private let document: PDFDocument! private let outline: PDFOutline? private var pdfView = PDFView() init(pdfUrl: URL) { self.pdfUrl = pdfUrl self.document = PDFDocument(url: pdfUrl) self.outline = document.outlineRoot pdfView.document = document super.init(nibName: nil, bundle: nil) } ... override func viewDidLoad() { super.viewDidLoad() view.addSubview(pdfView) } } 

 import UIKit class ViewController: UIViewController { @IBAction func openPdfPressed(_ sender: Any) { guard let path = Bundle.main.url(forResource: "swift", withExtension: "pdf") else { print("failed to unwrap fileURL") return } let pdfViewController = PDFViewController(pdfUrl: path) present(pdfViewController, animated: true, completion: nil) } } 

क्षैतिज पृष्ठांकन सेट करें

अब हमारे पास दस्तावेज़ में सामग्री है, जिसे हमने pdfView.document में लिखा है। एक क्षैतिज स्क्रॉल बनाने के लिए, जैसा कि एक पुस्तक में, आपको PDFView में कई सेटिंग्स जोड़ने की आवश्यकता है।

 private func setupPDFView() { view.addSubview(pdfView) pdfView.displayDirection = .horizontal pdfView.usePageViewController(true) pdfView.pageBreakMargins = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) pdfView.autoScales = true } 

छवि

आसान नेविगेशन के लिए पेज आइकन

PDFKit में ThumbnailView जैसी आश्चर्यजनक चीज़ है। आपको बस हमारे pdfView को थंबनेल View.pdfView प्रॉपर्टी पर असाइन करना है। और वह सब है! कोई प्रतिनिधि, सूचना या अन्य सेटिंग नहीं।

 private func setupThumbnailView() { thumbnailView.pdfView = pdfView thumbnailView.backgroundColor = UIColor(displayP3Red: 179/255, green: 179/255, blue: 179/255, alpha: 0.5) thumbnailView.layoutMode = .horizontal thumbnailView.thumbnailSize = CGSize(width: 80, height: 100) thumbnailView.contentInset = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10) view.addSubview(thumbnailView) } 

छवि

अध्याय नेविगेशन के लिए प्रदर्शन सामग्री

एक विशिष्ट पृष्ठ प्राप्त करने के लिए, हमें एक विशिष्ट पृष्ठ ( PDFPage ) को PDFView में स्थानांतरित करना होगा । इसलिए हमें वांछित पृष्ठ ( पेज ) को प्राप्त करने के लिए दस्तावेज़ ( दस्तावेज़ ) में सामग्री (पदानुक्रम) के पदानुक्रम में तल्लीन करने की आवश्यकता है।

छवि

मैं एक पॉपअप ( पॉपओवर ) के रूप में UITableViewController का उपयोग कर रहा हूं। इसलिए, मुझे इसकी आवश्यकता है:

  1. एक प्रोटोकॉल बनाएँ। UITableViewController को इस प्रोटोकॉल का पालन करना चाहिए।
  2. PDFViewController में PDFView का उपयोग करने के लिए कुछ प्रतिनिधि तरीके जोड़ें।
  3. उपयोगकर्ता द्वारा किसी विशिष्ट कक्ष का चयन करने पर प्रतिनिधि विधि को कॉल करें।

 import UIKit import PDFKit protocol OutlineDelegate: class { func goTo(page: PDFPage) } class OutlineTableViewController: UITableViewController { let outline: PDFOutline weak var delegate: OutlineDelegate? init(outline: PDFOutline, delegate: OutlineDelegate?) { self.outline = outline self.delegate = delegate super.init(nibName: nil, bundle: nil) } ... override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return outline.numberOfChildren } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as UITableViewCell if let label = cell.textLabel, let title = outline.child(at: indexPath.row)?.label { label.text = String(title) } return cell } override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { if let page = outline.child(at: indexPath.row)?.destination?.page { delegate?.goTo(page: page) } } } 

छवि

हुर्रे! इसलिए हमने PDFKit के 3 मुख्य कार्यों को लागू किया। अभी भी इंटरफ़ेस के कुछ तुच्छ विवरण हैं, लेकिन इस लेख में हम उन पर ध्यान केंद्रित नहीं करेंगे। परियोजना सभी के लिए उपलब्ध है।

Source: https://habr.com/ru/post/hi431012/


All Articles