#ios #swift #xcode #airprint #uitableviewdiffabledatasource
Вопрос:
У меня есть приложение со списком дел (в стиле дел). данные отображаются в виде таблицы с различными источниками данных с пользовательскими ячейками. У меня есть действующее выпадающее меню, и я пытаюсь добавить print
кнопку, чтобы пользователь мог распечатать список, если захочет (кажется стандартным во многих приложениях для списков).
До сих пор у меня есть следующее в действии кнопки:
let printController = UIPrintInteractionController.shared
printController.delegate = self
let printInfo = UIPrintInfo(dictionary: nil)
printInfo.outputType = .general
printInfo.jobName = "Print TableView"
printController.printInfo = printInfo
let tableViewPDF = self?.tableView.exportAsPdfFromTable()
printController.printingItem = tableViewPDF
let formatter = UIPrintFormatter()
formatter.perPageContentInsets = UIEdgeInsets(top: 50, left: 50, bottom: 50, right: 50)
printController.printFormatter = formatter
printController.present(animated: true, completionHandler: nil)
и делегат:
extension ListTableViewController: UIPrintInteractionControllerDelegate {
func printInteractionControllerParentViewController(_ printInteractionController: UIPrintInteractionController) -> UIViewController? {
return self
}
}
Как вы можете видеть, я пытаюсь преобразовать представление таблицы в PDF и распечатать его (возможно, что-то еще может быть лучше?). .exportAsPdfFromTable()
Метод в TableView является UITableView
расширением следующим образом:
extension UITableView {
// Export pdf from UITableView and save pdf in drectory and return pdf file path
func exportAsPdfFromTable() -> String {
let originalBounds = self.bounds
self.bounds = CGRect(x:originalBounds.origin.x, y: originalBounds.origin.y, width: self.contentSize.width, height: self.contentSize.height)
let pdfPageFrame = CGRect(x: 0, y: 0, width: self.bounds.size.width, height: self.contentSize.height)
let pdfData = NSMutableData()
UIGraphicsBeginPDFContextToData(pdfData, pdfPageFrame, nil)
UIGraphicsBeginPDFPageWithInfo(pdfPageFrame, nil)
guard let pdfContext = UIGraphicsGetCurrentContext() else { return "" }
self.layer.render(in: pdfContext)
UIGraphicsEndPDFContext()
self.bounds = originalBounds
// Save pdf data
return self.saveTablePdf(data: pdfData)
}
// Save pdf file in document directory
func saveTablePdf(data: NSMutableData) -> String {
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
let docDirectoryPath = paths[0]
let pdfPath = docDirectoryPath.appendingPathComponent("tablePdf.pdf")
if data.write(to: pdfPath, atomically: true) {
return pdfPath.path
} else {
return ""
}
}
}
В результате на контроллере печати отображается пустая страница. Есть какие-нибудь идеи о том, чего мне не хватает?
Комментарии:
1. Что означает «преобразовать tableview в PDF»? Почему бы вам не поработать с источником данных табличного представления для создания текстовой строки?