#ios #swift #uiview #uiscrollview #pdf-generation
#iOS #swift #uiview #uiscrollview #pdf-генерация
Вопрос:
У меня есть несколько UIViews
с чистым цветом фона и черными рамками, размер которых изменяется в зависимости от значений, которые я ввожу в текстовые поля длина, ширина и высота. Эти представления являются подвидами UIScrollView
. После изменения размеров видов я создаю PDF-файл из содержимого вида прокрутки, в результате чего получаются векторизованные контуры, которые я могу использовать и манипулировать ими в Adobe Illustrator.
Этот процесс отлично работает, когда я использую небольшие размеры для представлений (например, 15 x 15), но когда я использую более идеальные размеры для своих целей (например, 3000 x 3000), представления выходят за пределы экрана, и результирующий сгенерированный PDF-файл содержит лишь небольшую часть представлений.
В идеале мне нужно иметь возможность создавать гораздо большие виды и при этом иметь возможность генерировать содержащий их PDF-файл. Я представляю холст, который изменяет размер (уменьшает масштаб?) в зависимости от его содержимого и сохраняет масштаб своих подвидов, так что результирующие виды в PDF будут соответствовать масштабу при просмотре в Adobe Illustrator. Пока это мой код:
override func viewDidLoad() {
super.viewDidLoad()
lengthTextField.delegate = self
widthTextField.delegate = self
heightTextField.delegate = self
scrollView.delegate = self
scrollView.autoresizingMask = [UIView.AutoresizingMask.flexibleWidth,UIView.AutoresizingMask.flexibleHeight]
scrollView.minimumZoomScale = 1
scrollView.maximumZoomScale = 50
scrollView.zoomScale = 1
self.setupGestureRecognizer()
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
scrollView.contentSize = CGSize(width: 5000, height: 5000)
}
func setupGestureRecognizer() {
}
@IBAction func viewPDF(_ sender: Any) {
createPDFfrom(aView: self.scrollView.subviews[0], saveToDocumentsWithFileName: "MC.pdf")
// Create and add a PDFView to the view hierarchy.
let pdfView = PDFView(frame: self.scrollView.subviews[0].bounds)
pdfView.autoScales = true
view.addSubview(pdfView)
// Create a PDFDocument object and set it as PDFView's document to load the document in that view.
let documentsDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
let filePath = (documentsDirectory as NSString).appendingPathComponent("MC.pdf") as String
let pdfDocument = PDFDocument(url: URL(fileURLWithPath: filePath))!
pdfView.document = pdfDocument
let document = NSData(contentsOfFile: filePath)
let vc = UIActivityViewController(activityItems: [document as Any], applicationActivities: nil)
self.present(vc, animated: true, completion: nil)
}
func createPDFfrom(aView: UIView, saveToDocumentsWithFileName fileName: String)
{
let pdfData = NSMutableData()
UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil)
UIGraphicsBeginPDFPage()
guard let pdfContext = UIGraphicsGetCurrentContext() else { return }
aView.layer.render(in: pdfContext)
UIGraphicsEndPDFContext()
if let documentDirectories = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first {
let documentsFileName = documentDirectories "/" fileName
debugPrint(documentsFileName)
pdfData.write(toFile: documentsFileName, atomically: true)
}
}
@IBAction func updateDimensions(_ sender: Any) {
guard let length = NumberFormatter().number(from:
lengthTextField.text ?? "") else { return }
guard let width = NumberFormatter().number(from:
widthTextField.text ?? "") else { return }
guard let height = NumberFormatter().number(from:
heightTextField.text ?? "") else { return }
let flapHeight = CGFloat(truncating: width)/2
let lengthFloat = CGFloat(truncating: length)
let widthFloat = CGFloat(truncating: width)
let heightFloat = CGFloat(truncating: height)
UIView.animate(withDuration: 0.3) {
self.faceAWidthConstraint.constant = lengthFloat
self.faceAHeightConstraint.constant = heightFloat
self.faceBWidthConstraint.constant = widthFloat
self.faceA1HeightConstraint.constant = flapHeight
self.view.layoutIfNeeded()
}
}
func viewForZooming(in scrollView: UIScrollView) -> UIView? {
return scrollView.subviews[0]
}
}
Ответ №1:
Я думаю, что если вы используете UIGraphicsPDFRenderer
, это может работать лучше:
let url = URL(fileURLWithPath: filePath)
let pdfGenerator = UIGraphicsPDFRenderer(bounds: .init(x: 0, y: 0, width: 612, height: 792))
pdfGenerator.writePDF(to: url) { context in
let cgContext = context.cgContext
aView.layer.render(in: cgContext)
}
Если представления по-прежнему выходят за пределы PDF-файла, вы можете масштабировать контекст:
cgContext.scaleBy(x: 0.25, y:0.25)