Печать
В iOS 4.2 и позже, приложения могут добавить поддержку печати содержания к локальным AirPrint-способным принтерам. Несмотря на то, что не для всех приложений нужна поддержка печати, это часто - полезная функция, если Ваше приложение используется для создания содержания (такого как текстовой процессор или графический редактор), совершая покупки (распечатывающий подтверждения заказа), и другие задачи, где пользователь мог бы обоснованно хотеть постоянную запись.
Эта глава объясняет, как добавить поддержку печати Вашему приложению. На высоком уровне Ваше приложение создает рабочее место печати, обеспечивая или массив готовых к печати изображений и документов в формате PDF, единственного изображения или документ в формате PDF, экземпляр любого из встроенных классов средства форматирования печати или пользовательское средство рендеринга страницы.
Печать в iOS Разработана, чтобы быть Простой и Интуитивной
Для печати пользователи касаются кнопки, которая обычно находится в панели навигации или панели инструментов, связанной с представлением или выбранным пунктом, который пользователь хочет распечатать. Приложение тогда представляет представление параметров печати. Пользователь выбирает параметры принтера и различные варианты и затем запрашивает печать. Приложение просят генерировать вывод печати от его содержания или предоставить печатаемые данные или файл URLs. Требуемое задание печати является spooled, и управление возвращается к приложению. Если целевой принтер в настоящее время не занят, печать сразу начинается. Если принтер уже распечатывает или если существуют задания, прежде чем он в очереди, задание печати останется в очереди печати iOS, пока он не перемещается в вершину очереди и распечатан.
Пользовательский интерфейс печати
Первой вещью, которую пользователь видит связанный с печатью, является кнопка печати. Кнопка печати часто является элементом кнопки панели на панели навигации или панели инструментов. Кнопка печати должна логически примениться к содержанию, которое представляет приложение; если пользователь касается кнопки, приложение должно распечатать то содержание. Несмотря на то, что кнопка печати может быть любой пользовательской кнопкой, рекомендуется использовать системную кнопку пункта действия, показанную на рисунке 5-1. Это - a UIBarButtonItem
объект, указанный с UIBarButtonSystemItemAction
постоянный, который Вы создаете или в Интерфейсном Разработчике или путем вызова initWithBarButtonSystemItem:target:action:
.
Когда пользователь касается кнопки печати, объект контроллера приложения получает сообщение действия. Контроллер отвечает путем подготовки к печати и отображению представления параметров принтера. Опции всегда включают целевой принтер (выбранный из списка поддающихся обнаружению принтеров), число копий, и иногда диапазон страниц для печати. Если выбранный принтер способен к двусторонней печати, пользователи могут выбрать односторонний или двусторонний вывод. Если пользователи решают не распечатать, они касаются вне представления опций (на iPad) или касаются Кнопки отмены (на iPhone и iPod touch) для отклонения представления параметров принтера.
Вид показанного пользовательского интерфейса зависит от устройства. На iPad платформа UIKit выводит на экран представление легкой сдобы, содержащее опции, как показано на рисунке 5-2. Приложение может анимировать это представление для появления от кнопки печати или от произвольной области пользовательского интерфейса приложения.
На iPhone и устройствах iPod touch, UIKit выводит на экран лист параметров печати, которые приложение может анимировать для скольжения с нижней части экрана, как показано на рисунке 5-3.
Как только задание печати было представлено и или распечатывает или ожидает в очереди печати, пользователи могут проверить ее состояние двойным ответвлением кнопка «Домой» для доступа к Центру Печати в многозадачном UI. Центр Печати (показанный на рисунке 5-4) является фоновым системным приложением, показывающим порядок заданий в очереди печати, включая тех, которые в настоящее время распечатывают. В то время как задание печати происходит, это только доступно.
Пользователи могут коснуться задания печати в Центре Печати для получения подробной информации об этом (рисунок 5-5) и задания отмены, распечатывающие или ожидающие в очереди.
Как Печать Работ в iOS
Приложение использует UIKit печать API для сборки элементов задания печати, включая содержание для печати и информация, связанная с заданием печати. Это тогда представляет представление параметров принтера, описанное в Пользовательском интерфейсе Печати. Пользователь делает его или ее выбор и затем касается Печати. В некоторых случаях платформа UIKit тогда просит, чтобы приложение нарисовало содержание, которое будет распечатано; UIKit записывает то, что приложение рисует как данные PDF. UIKit тогда вручает от данных печати подсистеме печати.
Система печати делает несколько вещей. Поскольку UIKit передает данные печати подсистеме печати, это пишет эти данные в хранение (т.е. это шпульки данные). Это также получает информацию о задании печати. Система печати управляет объединенными данными печати и метаданными для каждого задания печати в очереди печати метода «первым пришел - первым вышел». Многократные приложения на устройстве могут представить многократные задания печати подсистеме печати, и все они помещаются в очередь печати. Каждое устройство имеет одну очередь для всех заданий печати независимо от исходного приложения или целевого принтера.
Когда задание печати повышается до вершины очереди, системный демон печати (printd
) рассматривает требования целевого принтера и, при необходимости, преобразовывает данные печати в форму, которая применима принтером. Система печати сообщает о состояниях ошибки такой как «Из Бумаги» пользователю как предупреждения. Это также сообщает о прогрессе заданий печати программно к Центру Печати, выводящему на экран информацию, такую как “страница 2 5” для задания печати.
Эта полная архитектура показана на рисунке 5-6.
UIKit печать API
UIKit печать API включает восемь классов и один формальный протокол. Объекты этих классов и делегата, реализующего протокол, имеют отношения во время выполнения, как изображено на рисунке 5-7.
Печать обзора поддержки
На высоком уровне существует два способа добавить печать к Вашему приложению. Если Вы используете a UIActivityViewController
, и если Вам не нужна возможность управлять, может ли пользователь выбрать, страница располагаются или переопределяют бумажный процесс выбора, можно добавить действие печати.
Иначе, для добавления печати к приложению необходимо работать с UIPrintInteractionController
класс. Совместно используемый экземпляр UIPrintInteractionController
класс предоставляет Вашему приложению возможность указать то, что должно произойти, когда пользователь говорит Вашему приложению распечатывать. Это содержит информацию о задании печати (UIPrintInfo
) и размер бумаги и области для печатного содержания (UIPrintPaper
). Это может также иметь ссылку на объект делегата, принимающий UIPrintInteractionControllerDelegate
протокол для дальнейшего поведения конфигурирования.
Что еще более важно контроллер взаимодействия печати позволяет Вашему приложению обеспечить содержание, которое будет распечатано. UIPrintInteractionController
класс обеспечивает три отличных способа распечатать содержание:
Статические изображения или PDFs. Для простого содержания можно использовать контроллер взаимодействия печати
printingItem
илиprintingItems
свойства для обеспечения изображения (в различных форматах), файл PDF или массив изображений и файлов PDF.Средства форматирования печати. Если необходимо распечатать текст и содержимое HTML с автоматическим обратным течением, можно присвоить экземпляр любого из встроенных классов средства форматирования печати контроллера взаимодействия печати
printFormatter
свойство.Средства рендеринга страницы. Средства рендеринга страницы позволяют Вам обеспечить свои собственные подпрограммы получения для пользовательского содержания и дать Вам полный контроль над макетом страницы, включая заголовки и нижние колонтитулы. Для использования средства рендеринга страницы необходимо сначала записать подкласс средства рендеринга страницы, затем присвоить экземпляр его к контроллеру взаимодействия печати
printPageRenderer
свойство.
С таким диапазоном опций, доступных Вам, каков наилучший вариант для Вашего приложения? Таблица 5-1 разъясняет факторы, вовлеченные в принятие этого решения.
Если... | Тогда... |
---|---|
Ваше приложение имеет доступ к непосредственно печатаемому содержанию (изображения или документы в формате PDF). | Используйте |
Вы хотите распечатать единственное изображение или документ в формате PDF и хотеть, чтобы пользователь был в состоянии выбрать диапазон страницы. | Используйте |
Вы хотите распечатать простой текст или документ HTML (и не хотят дополнительное содержание, такое как заголовки и нижние колонтитулы). | Присвойте a |
Вы хотите распечатать содержание представления UIKit (и не хотят дополнительное содержание, такое как заголовки и нижние колонтитулы). | Получите a |
Вы хотите, чтобы печатные страницы имели повторяющиеся заголовки и нижние колонтитулы, возможно с постепенно увеличенными номерами страниц. | Присвойте экземпляр пользовательского подкласса |
Вы смешали содержание или источники, которые Вы хотите распечатать — например, HTML и пользовательское получение. | Присвойте экземпляр |
Вы хотите иметь самую большую сумму управления тем, что нарисовано для печати. | Присвойте экземпляр пользовательского подкласса |
Печать потока операций
Общий поток операций для печати изображения, документа или другого печатаемого содержания приложения следующие:
Получите совместно используемый экземпляр
UIPrintInteractionController
.(Дополнительный, но строго рекомендуемый), Создают a
UIPrintInfo
объект, атрибуты набора, такие как выходной тип, имя задания и ориентация печати; тогда присвойте объектprintInfo
свойствоUIPrintInteractionController
экземпляр. (Установка выходного типа и имени задания строго рекомендуется.)Если Вы не присваиваете объект информации печати, UIKit принимает атрибуты по умолчанию для задания печати (например, имя задания является именем приложения).
(Необязательно) Присвойте пользовательский объект контроллера
delegate
свойство. Этот объект должен принятьUIPrintInteractionControllerDelegate
протокол. Делегат может сделать диапазон задач. Это может ответить соответственно, когда параметры печати представлены и отклонены, и когда задание печати запускается и заканчивается. Это может возвратить родительский контроллер представления для контроллера взаимодействия печати.Кроме того, по умолчанию UIKit выбирает формат бумаги по умолчанию и печатаемую область на основе выходного типа, указывающего вид содержания, которое распечатывает Ваше приложение. Если для Вашего приложения нужно больше управления форматом бумаги, можно переопределить это стандартное поведение. Посмотрите Указание Формата бумаги, Ориентации и Опций Дуплекса для большего количества подробных данных.
Присвойте один из следующих к свойству
UIPrintInteractionController
экземпляр:Сингл
NSData
,NSURL
,UIImage
, илиALAsset
объект, содержащий или ссылающийся на данные PDF или данные изображения кprintingItem
свойство.Массив непосредственно печатаемых изображений или документов в формате PDF к
printingItems
свойство. Элементы матрицы должны бытьNSData
,NSURL
,UIImage
, илиALAsset
объекты, содержащие, ссылающиеся или представляющие данные PDF или изображения в поддерживаемых форматах.A
UIPrintFormatter
возразите противprintFormatter
свойство. Средства форматирования печати выполняют пользовательский макет печатаемого содержания.A
UIPrintPageRenderer
возразите противprintPageRenderer
свойство.
Только одно из этих свойств может быть не -
nil
для любого задания печати. См. Обзор Поддержки Печати для описаний этих свойств.При присвоении средства рендеринга страницы на предыдущем шаге тот объект обычно является экземпляром пользовательского подкласса
UIPrintPageRenderer
. Этот объект рисует страницы содержания для печати, когда требуется платформой UIKit. Это может также нарисовать содержание в заголовках и нижних колонтитулах печатных страниц. Пользовательское средство рендеринга страницы должно переопределить один или больше методов «получения» и, если оно рисует, по крайней мере, часть содержания (исключая заголовки и нижние колонтитулы), оно должно вычислить и возвратить число страниц для задания печати. (Обратите внимание на то, что можно использовать экземплярUIPrintPageRenderer
«как есть» соединить серию средств форматирования печати.)(Необязательно) при использовании средства рендеринга страницы можно создать один или больше
UIPrintFormatter
объекты с помощью конкретных подклассов этого класса; тогда добавьте средства форматирования печати для определенных страниц (или диапазоны страницы) кUIPrintPageRenderer
экземпляр любой путем вызоваaddPrintFormatter:startingAtPageAtIndex:
методUIPrintPageRenderer
или путем создания массива одного или более средств форматирования печати (каждый с ее собственной начальной страницей) и присвоения того массиваprintFormatters
свойствоUIPrintPageRenderer
.Если текущая идиома пользовательского интерфейса является iPad, представьте интерфейс печати пользователю путем вызова
presentFromBarButtonItem:animated:completionHandler:
илиpresentFromRect:inView:animated:completionHandler:
; если идиома является iPhone или iPod touch, вызватьpresentAnimated:completionHandler:
. Также можно встроить печать UI в существующий UI путем реализации aprintInteractionControllerParentViewController:
метод делегата. Если Ваше приложение использует лист действия (в iOS 6.0 и позже), можно также добавить элемент действия печати.
Отсюда, процесс варьируется в зависимости от того, распечатываете ли Вы использующее статическое содержание, средство форматирования печати или средство рендеринга страницы.
Печать готового к принтеру содержания
Система печати iOS принимает определенные объекты и распечатывает их содержание непосредственно с минимальным участием приложением. Эти объекты являются экземплярами NSData
, NSURL
, UIImage
, и ALAsset
классы, и они должны содержать или ссылочные данные изображения или данные PDF. Данные изображения включают все эти типы объектов; данными PDF или ссылаются NSURL
объекты или инкапсулировавший NSData
объекты. Существуют дополнительные требования для этих готовых к принтеру объектов:
Изображение должно быть в формате, поддерживаемом Изображением платформой I/O. Посмотрите Поддерживаемые форматы изображения в Ссылке класса UIImage для списка этих форматов.
NSURL
объекты должны использовать в качестве схемыfile:
,assets-library:
, или что-либо, что может возвратитьсяNSData
с зарегистрированным протоколом (например, QuickLookx-apple-ql-id:
схема).ALAsset
объекты должны иметь типALAssetTypePhoto
.
Вы присваиваете готовые к принтеру объекты любой printingItem
или printingItems
свойство совместно используемого UIPrintInteractionController
экземпляр. Вы присваиваете единственный готовый к принтеру объект printingItem
и массив готовых к принтеру объектов к printingItems
свойство.
Прежде, чем присвоить объекты этим свойствам, необходимо проверить объекты при помощи одного из методов класса UIPrintInteractionController
. Если, например, у Вас есть UTI изображения, и Вы хотите проверить, что изображение готово к принтеру, можно протестировать его сначала с printableUTIs
метод класса, возвращающий набор UTIs, которые допустимы для системы печати:
if ([[UIPrintInteractionController printableUTIs] containsObject:mysteryImageUTI]) |
printInteractionController.printingItem = mysteryImage; |
Точно так же можно применяться canPrintURL:
и canPrintData:
методы класса UIPrintInteractionController
к NSURL
и NSData
объекты до присвоения тех объектов к printingItem
или printingItems
свойства. Эти методы определяют, может ли система печати непосредственно распечатать те объекты. Их использование строго рекомендуется, специально для PDF.
Перечисление 5-1 показывает код, распечатывающий документ в формате PDF, инкапсулировавший в NSData
объект. Прежде, чем присвоить его printingItem
, это тестирует законность объекта. Это также говорит контроллеру взаимодействия печати включать средства управления диапазона страницы в параметры печати, представленные пользователю.
Перечисление 5-1 , Распечатывающее единственный документ в формате PDF с возможностью выбора диапазона страницы
- (IBAction)printContent:(id)sender { |
UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController]; |
if (pic && [UIPrintInteractionController canPrintData: self.myPDFData] ) { |
pic.delegate = self; |
UIPrintInfo *printInfo = [UIPrintInfo printInfo]; |
printInfo.outputType = UIPrintInfoOutputGeneral; |
printInfo.jobName = [self.path lastPathComponent]; |
printInfo.duplex = UIPrintInfoDuplexLongEdge; |
pic.printInfo = printInfo; |
pic.showsPageRange = YES; |
pic.printingItem = self.myPDFData; |
void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = |
^(UIPrintInteractionController *pic, BOOL completed, NSError *error) { |
self.content = nil; |
if (!completed && error) |
NSLog(@"FAILED! due to error in domain %@ with error code %u", |
error.domain, error.code); |
}; |
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { |
[pic presentFromBarButtonItem:self.printButton animated:YES |
completionHandler:completionHandler]; |
} else { |
[pic presentAnimated:YES completionHandler:completionHandler]; |
} |
} |
Процедура для представления нескольких готовых к принтеру объектов сразу идентична — кроме (конечно), необходимо присвоить массив этих объектов к printingItems
свойство:
pic.printingItems = [NSArray arrayWithObjects:imageViewOne.image, imageViewTwo.image, imageViewThree.image, nil]; |
Используя средства форматирования печати и средства рендеринга страницы
Средства форматирования печати и средства рендеринга страницы являются объектами, размечающими печатаемое содержание по многократным страницам. Они указывают начинающуюся страницу содержания и вычисляют заключительную страницу содержания на основе начальной страницы, предметной области и содержания, которое они размечают. Они могут также указать поля относительно печатаемой области страницы. Различие может быть получено в итоге следующим образом:
Средства форматирования печати размечают единственную часть содержания (блок текста или HTML, представления, и т.д.).
Средства рендеринга страницы позволяют Вам добавить заголовки и нижние колонтитулы, выполнить пользовательское получение, и т.д. Средства рендеринга страницы могут при желании использовать средства форматирования печати для выполнения большей части их работы.
Если Вы создаете пользовательский подкласс
UIPrintPageRenderer
, можно нарисовать каждую страницу печатаемого содержания частично или полностью. Средство рендеринга страницы может иметь одно или более средств форматирования печати, связанных с определенными страницами или диапазонами страницы печатаемого содержания.
Установка свойств макета для задания печати
Определить области на страницах для печатаемого содержания, UIPrintFormatter
класс объявляет четыре ключевых свойства для своих конкретных подклассов. Эти свойства, вместе с footerHeight
и headerHeight
свойства UIPrintPageRenderer
и paperSize
и printableRect
свойства UIPrintPaper
, определите расположение многостраничного задания печати. Рисунок 5-8 изображает это расположение.
Свойство | Описание |
---|---|
Расстояния во вставке точек от вершины, оставленной, и правильные границы печатаемого прямоугольника. Эти значения устанавливают поля печатного содержания, несмотря на то, что они могут быть переопределены | |
Указывает максимальную высоту предметной области, который факторы в любом заголовке или высоте нижнего колонтитула. UIKit сравнивает это значение с высотой предметной области минус вставленная содержанием вершина и использует меньшие из двух значений. | |
Указывает максимальную ширину предметной области. UIKit сравнивает это значение с шириной предметной области, создаваемой вставленным содержанием левым и вставленное содержанием право, и использует меньшие из двух значений. | |
Страница, на которой это средство форматирования должно начать рисовать содержание для печати. Это значение основано на нуле — первая страница вывода имеет значение 0 — но средство форматирования, используемое средством рендеринга пейджера, может начать привлекать более позднюю страницу. Например, чтобы сказать средству форматирования начинать распечатывать на третьей странице, средство рендеринга страницы указало бы 2 для |
UIPrintFormatter
использование все свойства, изображенные в схеме на рисунке 5-8 для вычислений числа страниц, необходимых для задания печати; это хранит это значение в только для чтения pageCount
свойство.
Используя средство форматирования печати
UIKit позволяет Вам присваивать единственное средство форматирования печати для задания печати. Это может быть полезной возможностью, если у Вас есть простой текст или документы HTML, потому что UIKit имеет конкретные классы средства форматирования печати для этих типов текстового содержания. Платформа также реализует конкретный подкласс средства форматирования печати, позволяющий Вам распечатать содержание определенных представлений UIKit благоприятным для принтера способом.
UIPrintFormatter
класс является абстрактным базовым классом для предоставленных системой средств форматирования печати. В настоящее время iOS обеспечивает следующие встроенные средства форматирования печати:
UIViewPrintFormatter
— автоматически размечает содержание представления по многократным страницам.Для получения средства форматирования печати для представления вызовите представление
viewPrintFormatter
метод.Не вся встроенная печать поддержки классов UIKit. В настоящее время, только классы представления
UIWebView
,UITextView
, иMKMapView
знайте, как нарисовать их содержание для печати.Средства форматирования представления не должны использоваться для печати Ваших собственных представлений. Для печати содержания пользовательского представления используйте a
UIPrintPageRenderer
вместо этого.UISimpleTextPrintFormatter
— автоматически рисует и размечает документы простого текста. Это средство форматирования позволяет Вам устанавливать глобальные свойства для текста, такого шрифта, цвета, выравнивания и режима разрыва строки.UIMarkupTextPrintFormatter
— автоматически рисует и размечает документы HTML.
Несмотря на то, что следующее обсуждение принадлежит использованию единственного средства форматирования (и никакое средство рендеринга страницы), большая часть информации о средствах форматирования печати применяется к средствам форматирования печати, используемым в сочетании со средствами рендеринга страницы, который описан в Использовании Того или Большего количества Средств форматирования со Средством рендеринга Страницы.
Печать текста или документов HTML
Много приложений включают текстовое содержание, которое пользователи могли бы хотеть распечатать. Если содержание является простым текстом или текстом HTML, и у Вас есть доступ к отступающей строке для выведенного на экран текстового содержания, можно использовать экземпляр UISimpleTextPrintFormatter
или UIMarkupTextPrintFormatter
размечать и составлять текст для печати. Просто создайте экземпляр, инициализировав его с отступающей строкой, и укажите свойства макета. Тогда присвойте его printFormatter
переменная экземпляра совместно используемого UIPrintInteractionController
экземпляр.
Перечисление 5-2 иллюстрирует, как Вы могли бы использовать a UIMarkupTextPrintFormatter
возразите для печати документа HTML. Это добавляет дополнительный дюйм поля в (определенной с помощью принтера) печатаемой области. Можно определить печатаемую область путем исследования printPaper
свойство UIPrintInteractionController
объект. Для более полного примера того, как создать поля определенной ширины, посмотрите, что UIKit Распечатывает с проектом примера кода UIPrintInteractionController и UIViewPrintFormatter.
Перечисление 5-2 , Распечатывающее документ HTML (без информации заголовка)
- (IBAction)printContent:(id)sender { |
UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController]; |
pic.delegate = self; |
UIPrintInfo *printInfo = [UIPrintInfo printInfo]; |
printInfo.outputType = UIPrintInfoOutputGeneral; |
printInfo.jobName = self.documentName; |
pic.printInfo = printInfo; |
UIMarkupTextPrintFormatter *htmlFormatter = [[UIMarkupTextPrintFormatter alloc] |
initWithMarkupText:self.htmlString]; |
htmlFormatter.startPage = 0; |
htmlFormatter.contentInsets = UIEdgeInsetsMake(72.0, 72.0, 72.0, 72.0); // 1 inch margins |
pic.printFormatter = htmlFormatter; |
pic.showsPageRange = YES; |
void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = |
^(UIPrintInteractionController *printController, BOOL completed, NSError *error) { |
if (!completed && error) { |
NSLog(@"Printing could not complete because of error: %@", error); |
} |
}; |
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { |
[pic presentFromBarButtonItem:sender animated:YES completionHandler:completionHandler]; |
} else { |
[pic presentAnimated:YES completionHandler:completionHandler]; |
} |
} |
Помните это при использовании единственного средства форматирования печати для задания печати (т.е. a UIPrintFormatter
объект присвоился к printFormatter
свойство UIPrintInteractionController
экземпляр), Вы не можете нарисовать заголовок и содержание нижнего колонтитула на каждой печатной странице. Чтобы сделать это, необходимо использовать a UIPrintPageRenderer
объект плюс любые необходимые средства форматирования печати. Для получения дополнительной информации посмотрите Используя Одно или Более Средств форматирования со Средством рендеринга Страницы.
Процедура для использования a UISimpleTextPrintFormatter
объект разметить и распечатать документ простого текста почти идентичен. Однако класс этого объекта включает свойства, позволяющие Вам установить шрифт, цвет и выравнивание печатаемого текста.
Используя средство форматирования печати представления
Можно использовать экземпляр UIViewPrintFormatter
класс, чтобы разметить и распечатать содержание некоторых системных представлений. Платформа UIKit создает эти средства форматирования печати представления для представления. Часто тот же код, используемый для рисования представления для дисплея, используется для рисования представления для печати. В настоящее время система просматривает, чье содержание можно распечатать использование средства форматирования печати представления, экземпляры UIWebView
, UITextView
, и MKMapView
(Платформа MapKit).
Для получения представления распечатывают средство форматирования для a UIView
объект, вызвать viewPrintFormatter
на представлении. Установите начальную страницу и любые свойства макета и затем присвойте объект printFormatter
свойство UIPrintInteractionController
совместно используемый экземпляр. Также можно добавить средство форматирования печати представления к a UIPrintPageRenderer
возразите, используете ли Вы тот объект нарисовать части печатного вывода. Перечисление 5-3 показывает код, использующий средство форматирования печати представления от a UIWebView
возразите для печати содержания того представления.
Перечисление 5-3 , Распечатывающее содержание веб-представления
- (void)printWebPage:(id)sender { |
UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController]; |
void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = |
^(UIPrintInteractionController *printController, BOOL completed, NSError *error) { |
if(!completed && error){ |
NSLog(@"FAILED! due to error in domain %@ with error code %u", |
error.domain, error.code); |
} |
}; |
UIPrintInfo *printInfo = [UIPrintInfo printInfo]; |
printInfo.outputType = UIPrintInfoOutputGeneral; |
printInfo.jobName = [urlField text]; |
printInfo.duplex = UIPrintInfoDuplexLongEdge; |
controller.printInfo = printInfo; |
controller.showsPageRange = YES; |
UIViewPrintFormatter *viewFormatter = [self.myWebView viewPrintFormatter]; |
viewFormatter.startPage = 0; |
controller.printFormatter = viewFormatter; |
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { |
[controller presentFromBarButtonItem:printButton animated:YES completionHandler:completionHandler]; |
}else |
[controller presentAnimated:YES completionHandler:completionHandler]; |
} |
Для полного примера на основе UIViewPrintFormatter
, посмотрите, что UIKit Распечатывает с проектом примера кода UIPrintInteractionController и UIViewPrintFormatter.
Используя средство рендеринга страницы
Средство рендеринга страницы является экземпляром пользовательского подкласса UIPrintPageRenderer
это рисует полное или частичное содержание задания печати. Для использования один необходимо создать подкласс, добавить его к проекту и инстанцировать его при подготовке a UIPrintInteractionController
экземпляр для задания печати. Тогда присвойте средство рендеринга страницы printPageRenderer
свойство UIPrintInteractionController
экземпляр. Средство рендеринга страницы может иметь одно или более средств форматирования печати, связанных с ним; если это делает, это смешивает свое получение с получением средств форматирования печати.
Средство рендеринга страницы может нарисовать и разметить печатаемое содержание самостоятельно, или это может использовать средства форматирования печати для обработки некоторых или всего рендеринга определенных диапазонов страниц. Таким образом, для относительно прямых потребностей форматирования, можно использовать экземпляр UIPrintPageRenderer
«как есть» соединить многократные средства форматирования печати. Однако большинство средств рендеринга страницы обычно является экземплярами пользовательских подклассов UIPrintPageRenderer
.
UIPrintPageRenderer
базовый класс включает свойства для количества страницы и для высот заголовков и нижних колонтитулов страниц. Это также объявляет несколько методов, которые можно переопределить для рисования определенных частей страницы: заголовок, нижний колонтитул, само содержание, или интегрировать средство рендеринга страницы и получение средства форматирования печати.
Установка атрибутов средства рендеринга страницы
Если Ваше средство рендеринга страницы собирается нарисовать в заголовке или нижнем колонтитуле каждой печатной страницы, необходимо указать высоту для заголовка и нижнего колонтитула. Чтобы сделать это, присвойте значения плавающие (представляющий точки) к headerHeight
и footerHeight
свойства, наследованные Вашим подклассом. Если эти свойства имеют значения высоты 0 (значение по умолчанию), drawHeaderForPageAtIndex:inRect:
и drawFooterForPageAtIndex:inRect:
методы не вызывают.
Если Ваше средство рендеринга страницы собирается нарисовать в предметной области страницы — т.е. область между каким-либо заголовком или областями нижнего колонтитула — тогда, Ваш подкласс должен переопределить numberOfPages
метод, чтобы вычислить и возвратить число страниц средство рендеринга страницы нарисует. Если средства форматирования печати, связанные со средством рендеринга страницы, соберутся нарисовать все содержание между заголовком и нижним колонтитулом, то средства форматирования печати вычислят число страниц для Вас. Эта ситуация происходит, Ваше средство рендеринга страницы просто рисует в заголовке и областях нижнего колонтитула, и Вы позволяете средству форматирования печати нарисовать все другие содержание.
Со средством рендеринга страницы без связанного средства форматирования печати полностью ваше дело расположение каждой страницы печатаемого содержания. Когда вычислительные метрики расположения, можно принять во внимание headerHeight
, footerHeight
, paperRect
, и printableRect
свойства UIPrintPageRenderer
(последние два свойства только для чтения). Если средства форматирования печати использования средства рендеринга страницы, метрики расположения также включают contentInsets
, maximumContentHeight
, и maximumContentWidth
свойства UIPrintFormatter
. Посмотрите Установку Свойств макета для Задания Печати для иллюстрации и объяснения.
Реализация методов рисования
Когда приложение использует средство рендеринга страницы для рисования печатаемого содержания, UIKit вызывает следующие методы для каждой страницы требуемого содержания. Обратите внимание на то, что нет никакой гарантии, что UIKit вызывает эти методы в порядке последовательности страницы. Кроме того, если пользователи запрашивают подмножество страниц для печати (т.е. они указывают диапазон страницы), UIKit не вызывает методы для страниц не в подмножестве.
drawPageAtIndex:inRect:
вызовы метода каждый из других методов получения, в порядке упоминается ниже. Ваше приложение может переопределить этот метод, если Вы хотите иметь полный контроль над тем, что нарисовано для печати.
Переопределение... | К... |
---|---|
Нарисуйте содержание в заголовке. Если headerHeight 0, этот метод не вызывают. | |
Нарисуйте содержание задания печати (т.е. область между заголовком и нижним колонтитулом). | |
Смешайте пользовательское получение с получением, выполняемым средствами форматирования печати. Этот метод вызывают для каждого средства форматирования печати, связанного с данной страницей. Посмотрите Используя Одно или Более Средств форматирования со Средством рендеринга Страницы для получения дополнительной информации. | |
Нарисуйте содержание в нижнем колонтитуле. Если footerHeight 0, этот метод не вызывают. |
Все эти методы рисования устанавливаются для рисования к текущему графическому контексту (как возвращено UIGraphicsGetCurrentContext
). Прямоугольник передал в каждый метод — определение области заголовка, области нижнего колонтитула, предметной области, и вся страница — имеет значения относительно источника страницы, которая находится в верхнем левом углу.
Перечисление 5-4 показывает реализации в качестве примера drawHeaderForPageAtIndex:inRect:
и drawFooterForPageAtIndex:inRect:
методы. Они используют CGRectGetMaxX
и CGRectGetMaxY
вычислить размещение текста в footerRect
и headerRect
прямоугольники в системе координат печатаемого прямоугольника.
Перечисление 5-4 , Получающее заголовок и нижний колонтитул страницы
- (void)drawHeaderForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)headerRect { |
UIFont *font = [UIFont fontWithName:@"Helvetica" size:12.0]; |
CGSize titleSize = [self.jobTitle sizeWithFont:font]; |
//center title in header |
CGFloat drawX = CGRectGetMaxX(headerRect)/2 - titleSize.width/2; |
CGFloat drawY = CGRectGetMaxY(headerRect) - titleSize.height; |
CGPoint drawPoint = CGPointMake(drawX, drawY); |
[self.jobTitle drawAtPoint:drawPoint withFont: font]; |
} |
- (void)drawFooterForPageAtIndex:(NSInteger)pageIndex inRect:(CGRect)footerRect { |
UIFont *font = [UIFont fontWithName:@"Helvetica" size:12.0]; |
NSString *pageNumber = [NSString stringWithFormat:@"%d.", pageIndex+1]; |
// page number at right edge of footer rect |
CGSize pageNumSize = [pageNumber sizeWithFont:font]; |
CGFloat drawX = CGRectGetMaxX(footerRect) - pageNumSize.width - 1.0; |
CGFloat drawY = CGRectGetMaxY(footerRect) - pageNumSize.height; |
CGPoint drawPoint = CGPointMake(drawX, drawY); |
[pageNumber drawAtPoint:drawPoint withFont: font]; |
} |
Используя одно или более средств форматирования со средством рендеринга страницы
Средство рендеринга страницы может нарисовать печатаемое содержание в сочетании с одним или более средствами форматирования печати. Например, приложение может использовать a UISimpleTextPrintFormatter
возразите, чтобы нарисовать страницы текстового содержания для печати, но использовать средство рендеринга страницы для рисования заголовка документа в каждом верхнем колонтитуле страницы. Или приложение может использовать два средства форматирования печати, один для рисования заголовка (или сводка) информация в начале первой страницы и другого средства форматирования печати для рисования остающегося содержания; тогда это могло бы использовать средство рендеринга страницы, чтобы чертить линию, разделяя эти две части.
Как можно вспомнить, можно использовать единственное средство форматирования печати для задания печати путем присвоения его printFormatter
свойство UIPrintInteractionController
совместно используемый экземпляр. Но если Вы используете средство рендеринга страницы и распечатываете средства форматирования, необходимо связать каждое средство форматирования печати со средством рендеринга страницы. Вы делаете эти из двух путей:
Включайте каждое средство форматирования печати в массив, присвоенный
printFormatters
свойство.Добавьте каждое средство форматирования печати путем вызова
addPrintFormatter:startingAtPageAtIndex:
метод.
Перед соединением средства форматирования печати со средством рендеринга страницы, убедиться установить его свойства макета, включая начальную страницу (startPage
) из задания печати. Как только Вы установили эти свойства, UIPrintFormatter
вычисляет число страниц для средства форматирования печати. Обратите внимание на то, что, если Вы указываете начальную страницу путем вызова addPrintFormatter:startingAtPageAtIndex:
; то значение перезаписывает любое значение, присвоенное startPage
. Для обсуждения средств форматирования печати и метрик расположения, посмотрите Установку Свойств макета для Задания Печати.
Средство рендеринга страницы может переопределить drawPrintFormatter:forPageAtIndex:
интегрировать его получение с получением, выполняемым средствами форматирования печати, присвоилось к данной странице. Это может нарисовать в области страницы, где средство форматирования печати не рисует и затем вызывает drawInRect:forPageAtIndex:
метод на переданном - в средстве форматирования печати для имения его рисует свою часть страницы. Или средство рендеринга страницы может достигнуть эффекта «наложения» при наличии средства форматирования печати, рисуют сначала и затем рисование чего-то по содержанию, нарисованному средством форматирования печати.
Для полных примеров на основе UIPrintPageRenderer
, посмотрите PrintPhoto, Демонстрационное Средство рендеринга Страницы Печати и UIKit, Распечатывающий с проектами примера кода UIPrintInteractionController и UIViewPrintFormatter.
Тестирование печати содержимого приложения
iOS 4.2 SDK (и позже) обеспечивает приложение Средства моделирования Принтера, которое можно использовать для тестирования возможностей печати приложения. Приложение моделирует принтеры различных общих типов (струйный, черно-белый лазерный, цветной лазер, и т.д.). Это выводит на экран распечатанные страницы в приложении Предварительного просмотра OS X. Можно установить предпочтение для показа печатаемой области каждой страницы. Средство моделирования принтера также регистрирует информацию от системы печати о каждом задании печати.
Можно выполнить Средство моделирования Принтера в одном из тебя пути:
Выберите Open Printer Simulator из меню File в Средстве моделирования iOS.
Выберите Средство моделирования Принтера в XCode с помощью XCode> Открывают Developer Tool menu.
Можно найти Средство моделирования Принтера в следующем расположении файловой системы:
<Xcode>/Platforms/iPhoneOS.platform/Developer/Applications/PrinterSimulator.app
При тестировании кода печати приложения необходимо также реализовать обработчик завершения, переданный в present...
методы и журнал любые ошибки возвратились из системы печати. Эти ошибки являются обычно программными ошибками, которые необходимо поймать, прежде чем приложение развертывается. Посмотрите Завершение Задания печати Ответа и Ошибки для подробных данных.
Общие задачи печати
Всеми задачами кодирования, описанными ниже, являются вещи, которые приложение делает (или может сделать) в ответ на запрос на печать. Несмотря на то, что большинство задач может произойти в любом порядке, необходимо сначала проверить, что устройство способно к печати, и необходимо завершить с представлением параметров печати. Посмотрите Распечатывающее Готовое к принтеру Содержание, Используя Средства форматирования Печати и Средства рендеринга Страницы, и Используя Средство рендеринга Страницы для полных примеров.
Важный набор задач, не покрытых здесь, добавляет кнопку печати к надлежащему месту в пользовательском интерфейсе приложения, объявляя метод действия, делая соединение целевого действия, и реализовывая метод действия. (См. Пользовательский интерфейс Печати для рекомендации на который кнопка печати использовать.) Следующими задачами (за исключением Указания Формата бумаги, Ориентации и Опций Дуплекса) является часть реализации метода действия.
Тестирование на печать доступности
Некоторые устройства на iOS не поддерживают печать. Необходимо сразу определить этот факт, как только загружается представление. Если печать не доступна для устройства, Вы не должны или программно добавлять элемент пользовательского интерфейса печати (кнопка, элемент кнопки панели, и т.д.), или необходимо удалить любой элемент печати, загруженный из файла пера. Чтобы определить, доступна ли печать, вызовите isPrintingAvailable
метод класса UIPrintInteractionController
. Перечисление 5-5 иллюстрирует, как Вы могли бы сделать это; это принимает выход к кнопке печати (myPrintButton
) загруженный из файла пера.
Включение перечисления 5-5 или отключение кнопки печати на основе доступности печати
- (void)viewDidLoad { |
if (![UIPrintInteractionController isPrintingAvailable]) |
[myPrintButton removeFromSuperView]; |
// other tasks... |
} |
Указание информации о задании печати
Экземпляр UIPrintInfo
класс инкапсулирует информацию о задании печати в частности:
Выходной тип (указание типа содержания)
Имя задания печати
Ориентация печати
Дуплексный режим
Идентификатор выбранного принтера
Вы не должны присваивать значения всем UIPrintInfo
свойства; пользователи выбирают некоторые из этих значений, и UIKit принимает значения по умолчанию для других. (Действительно, Вы не должны даже явно создавать экземпляр UIPrintInfo
.)
Однако в большинстве случаев Вы захотите указать некоторые аспекты задания печати, такие как выходной тип. Получите экземпляр UIPrintInfo
путем вызова printInfo
метод класса. Присвойте значения свойствам объекта, которые Вы хотите сконфигурировать. Тогда присвойтесь UIPrintInfo
возразите против printInfo
свойство совместно используемого UIPrintInteractionController
экземпляр. Перечисление 5-6 дает пример этой процедуры.
Свойства Listing 5-6 Setting a UIPrintInfo
объект и присвоение его к printInfo
свойство
UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController]; |
UIPrintInfo *printInfo = [UIPrintInfo printInfo]; |
printInfo.outputType = UIPrintInfoOutputGeneral; |
printInfo.jobName = [self.path lastPathComponent]; |
printInfo.duplex = UIPrintInfoDuplexLongEdge; |
controller.printInfo = printInfo; |
Один из UIPrintInfo
свойства являются ориентацией печати: портрет или среда. Вы могли бы хотеть, чтобы ориентация печати удовлетворила размерностям распечатываемого объекта. Другими словами, если бы объект является большим, и его ширина больше, чем его высота, среда была бы подходящей ориентацией печати для него. Перечисление 5-7 иллюстрирует это с изображением.
Перечисление 5-7 , Устанавливающее ориентацию печати для соответствия размер изображения
UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController]; |
// other code here... |
UIPrintInfo *printInfo = [UIPrintInfo printInfo]; |
UIImage *image = ((UIImageView *)self.view).image; |
printInfo.outputType = UIPrintInfoOutputPhoto; |
printInfo.jobName = @"Image from PrintPhoto"; |
printInfo.duplex = UIPrintInfoDuplexNone; |
// only if drawing... |
if (!controller.printingItem && image.size.width > image.size.height) |
printInfo.orientation = UIPrintInfoOrientationLandscape; |
Указывая формат бумаги, ориентацию и опции дуплекса
По умолчанию UIKit представляет ряд форматов бумаги по умолчанию для печатаемого содержания на основе целевого принтера и выходного типа задания печати, как указано outputType
свойство UIPrintInfo
объект.
Например, если выходной тип UIPrintInfoOutputPhoto
, формат бумаги по умолчанию составляет 4 x 6 дюймов, A6 или некоторый другой стандартный размер, в зависимости от локали; если выходной тип UIPrintInfoOutputGeneral
или UIPrintInfoOutputGrayscale
, форматом бумаги по умолчанию является Буква США (8 1/2 x 11 дюймов), A4 или некоторый другой стандартный размер, в зависимости от локали.
Для большинства приложений эти форматы бумаги по умолчанию приемлемы. Однако некоторым приложениям, возможно, понадобился бы специальный формат бумаги. Основанное на странице приложение, возможно, должно было бы показать пользователю, как содержание фактически появится на бумаге данного размера, приложении, производящем брошюры, или поздравительные открытки могли бы иметь его собственный предпочтительный размер и т.д.
В этом случае делегат контроллера взаимодействия печати может реализовать UIPrintInteractionControllerDelegate
метод протокола printInteractionController:choosePaper:
возвратить a UIPrintPaper
объект, представляющий оптимальную комбинацию доступного формата бумаги и печатаемого прямоугольника для данного размера содержания.
У делегата есть два подхода, которые может проявить. Это может исследовать переданный - в массиве UIPrintPaper
объекты и идентифицируют наиболее подходящий тот. Или это может позволить системе выбрать самый подходящий объект путем вызова UIPrintPaper
метод класса bestPaperForPageSize:withPapersFromArray:
. Перечисление 5-8 показывает реализацию метода для приложения, поддерживающего многократные типы документов, каждого с его собственным размером страницы.
Перечисление 5-8 реализовывая printInteractionController:choosePaper:
метод
- (UIPrintPaper *)printInteractionController:(UIPrintInteractionController *)pic |
choosePaper:(NSArray *)paperList { |
// custom method & properties... |
CGSize pageSize = [self pageSizeForDocumentType:self.document.type]; |
return [UIPrintPaper bestPaperForPageSize:pageSize |
withPapersFromArray:paperList]; |
} |
Как правило, приложения, использующие пользовательский фактор средств рендеринга страницы формат бумаги в их вычисления числа страниц для задания печати (numberOfPages
).
Если Ваше приложение должно подарить пользователю выбор размера страницы (для приложения текстового редактора, например), необходимо реализовать тот UI сами, и необходимо тогда использовать тот формат бумаги в Вашем printInteractionController:choosePaper:
реализация. Например:
// Create a custom CGSize for 8.5" x 11" paper. |
CGSize custompapersize = CGSizeMake(8.5 * 72.0, 11.0 * 72.0); |
UIPrintInfo
класс также позволяет Вам обеспечить дополнительные настройки, такие как ориентация печати, выбранный принтер и режим дуплекса (если принтер поддерживает двустороннюю печать). Пользователи могут изменить выбранный принтер и дуплексные настройки от значений, которые Вы обеспечиваете
Интеграция распечатывающий в пользовательский интерфейс
Существует два способа интегрировать печать в Ваш пользовательский интерфейс:
Используя контроллер взаимодействия печати.
От листа действия (в iOS 6.0 и позже).
Путем Вы интегрируетесь, печать зависит, на каком из этих методов Вы выбираете.
Представление параметров печати Используя контроллер взаимодействия печати
UIPrintInteractionController
объявляет три метода для представления параметров печати пользователям, каждому с его собственной анимацией:
presentFromBarButtonItem:animated:completionHandler:
анимирует представление легкой сдобы от кнопки в панели навигации или панели инструментов (обычно кнопка печати).presentFromRect:inView:animated:completionHandler:
анимирует представление легкой сдобы от произвольного прямоугольника в представлении приложения.presentAnimated:completionHandler:
анимирует лист, скользящий с нижней части экрана.
Первые два из этих методов предназначаются, чтобы быть вызванными на устройства iPad; третий метод предназначается, чтобы быть вызванным на устройства iPod touch и iPhone. Можно условно кодировать для каждого типа устройства (или, идиома пользовательского интерфейса) путем вызова UI_USER_INTERFACE_IDIOM
и сравнивая результат с UIUserInterfaceIdiomPad
или UIUserInterfaceIdiomPhone
. Перечисление 5-9 дает пример этого.
Параметры печати Listing 5-9 Presenting, основанные на текущем типе устройства
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { |
[controller presentFromBarButtonItem:self.printButton animated:YES |
completionHandler:completionHandler]; |
} else { |
[controller presentAnimated:YES completionHandler:completionHandler]; |
} |
Если Ваше приложение вызывает один из специфичных для iPad методов на iPhone (и запрашивает анимацию), поведение по умолчанию состоит в том, чтобы вывести на экран параметры печати в листе, скользящем с нижней части экрана. Если Ваше приложение вызывает специфичный для iPhone метод на iPad, поведение по умолчанию состоит в том, чтобы анимировать представление легкой сдобы от текущей рамки окна.
Если Вы вызываете один из present…
методы, когда параметры печати уже выведены на экран, UIPrintInteractionController
скрывает представление параметров печати или лист. Необходимо вызвать метод снова для отображения опций.
При присвоении принтера ID или дуплексный режим, поскольку информация печати оценивает, они появляются как значения по умолчанию в параметрах печати. (Принтер должен быть способен к двусторонней печати для дуплексного управления для появления.), Если Вы хотите позволить своим пользователям выбрать диапазоны страниц для печати, необходимо установить showsPageRange
свойство UIPrintInteractionController
объект к YES
(NO
значение по умолчанию). Знайте, однако, что никакое управление диапазона страницы не появляется в параметрах печати при предоставлении печатаемого содержания через printingItems
свойство или если общее количество страниц равняется 1, даже если showsPageRange
YES
.
Если Вы хотите, чтобы печать UI появилась в определенном представлении, можно сделать это путем реализации printInteractionControllerParentViewController:
метод в Вашем UIPrintInteractionControllerDelegate
класс. Этот метод должен возвратить контроллер представления, который должен использоваться в качестве родителя для контроллера взаимодействия печати. Если предоставленный родительский контроллер представления является a UINavigationController
экземпляр, печать UI продвинут в представление в том контроллере. Для любого другого UIViewController
экземпляр, навигация печати показана как модальное диалоговое окно в указанном представлении.
Печать от листа действия
Если Ваше приложение использует лист действия (в iOS 6.0 и позже), можно позволить распечатывать от листа действия. Печать от листа действия более проста, чем использование контроллера взаимодействия печати. Существует два протеста, однако:
Приложение не может управлять, может ли пользователь выбрать диапазон страницы.
Приложение не может использовать методы делегата переопределить поведение, такое как ручное переопределение процесса выбора формата бумаги.
Для использования этого метода приложение должно создать массив элементов действия, содержащий:
A
UIPrintInfo
объект.Или объект средства форматирования средства рендеринга страницы, средство рендеринга страницы или печатаемый элемент.
Любые дополнительные элементы действия, подходящие для Вашего приложения.
Вы тогда вызываете initWithActivityItems:applicationActivities:
, передача того массива как первый параметр и nil
как второй параметр (или массив пользовательских действий, если Ваше приложение предоставляет кому-либо).
Наконец, Вы представляете представление действия с помощью стандартного контроллера представления present*
методы. Если пользователь принимает решение распечатать от того представления действия, iOS создает рабочее место печати для Вас. Для получения дополнительной информации читайте Ссылку класса UIActivityViewController и Ссылку класса UIActivity.
Ответ на завершение задания печати и ошибки
Заключительный параметр методов представления, объявленных UIPrintInteractionController
и описал в Представлении Параметров печати Используя Контроллер Взаимодействия Печати, обработчик завершения. Обработчик завершения является блоком типа UIPrintInteractionCompletionHandler
это вызывается, когда задание печати завершается успешно или когда оно завершается из-за ошибки. Можно обеспечить блочную реализацию, чистящую работоспособное состояние, которое Вы установили для задания печати. Обработчик завершения может также зарегистрировать сообщения об ошибках.
Пример в Перечислении 5-10 очищает внутреннее свойство после завершения или ошибки; если существует ошибка, она регистрирует информацию об этом.
Перечисление 5-10 Реализовывая блок обработчика завершения
void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = |
^(UIPrintInteractionController *pic, BOOL completed, NSError *error) { |
self.content = nil; |
if (!completed && error) |
NSLog(@"FAILED! due to error in domain %@ with error code %u", |
error.domain, error.code); |
}; |
UIKit автоматически выпускает все объекты, присвоенные UIPrintInteractionController
экземпляр в конце задания печати (за исключением делегата), таким образом, Вы не должны делать этого сами в обработчике завершения.
Ошибка печати представлена NSError
объект, имеющий домен UIPrintErrorDomain
и код ошибки, объявленный в UIPrintError.h
. В почти всех случаях эти коды указывают программные ошибки, так обычно нет никакой потребности сообщить пользователю о них. Однако некоторые ошибки могут следовать из попытки распечатать файл (расположенный схемой файла NSURL
объект), который приводит к ошибке.