Печать содержимого нескольких UIWebViews за один раз
У меня есть приложение для iPad, которое использует WebView для отображения списка URL-адресов. Я хотел бы иметь возможность распечатать все WebViews за один раз, не запрашивая пользователя несколько раз с PrintInteractionController. Проблема заключается в том, что PrintInteractionController не имеет возможности сделать это. Вы не можете назначить несколько viewFormatters, и WebViews не распознаются как printItems. Я также не нашел способа напечатать элементы и не показывать PrintInteractionController.
Кто-нибудь знает способ сделать это?
Приветствия.
2 ответа
Использование printPageRenderer
свойство вашего объекта UIPrintIterationController. Вы можете установить несколько подклассов UIPrintFormatter в объекте подкласса UIPrintPageRenderer.
Это старый вопрос, но я потратил несколько дней в поисках ответа и после некоторых вводящих в заблуждение комментариев в документах Apple и образце кода. Итак, я придерживаюсь этого здесь, чтобы спасти следующего парня в те дни, которые я потратил впустую
Конкретная проблема: как написать UIPrintPageRenderer
которые могут печатать несколько UIWebViews
в одном задании на печать, переданном UIPrintInteractionController?
Вы можете довольно далеко продвинуться до решения, которое не включает в себя сначала преобразование всего в PDF-файлы, используя этот пример кода Apple: PrintWebView. Также некоторым поможет эта документация: UIPrintPageRenderer. Проблема в том, что образец приложения и документация для UPPrintPageRenderer
предложить, если вы добавите несколько UIPrintFormatter
через это свойство:
@property(nonatomic,copy) NSArray <UIPrintFormatter *> *printFormatters
Пример кода, который Apple предоставила для переопределения метода -(NSInteger)numberOfPages
в PrintWebView будет просто работать и выяснить правильное количество страниц.... Нет!
Что вам нужно сделать, это добавить printFormatters
неочевидным способом через метод, показанный ниже, а затем исправьте их соответствующие свойства startPage и используйте их вместе, чтобы выработать правильный pageCount для возврата UIPrintPageRenderer. Вместо этого используйте это:
-(void)addPrintFormatter:(UIPrintFormatter *)formatter startingAtPageAtIndex:(NSInteger)pageIndex
Почему это работает, а другой нет? Понятия не имею, вероятно, ошибка.... Я должен подать радар:) Но благодаря @Mustafa и этому другому ответу Stackru за подсказку:
Вот шаги, которые нужно выполнить для печати нескольких UIWebViews в одном задании на печать:
- Следуйте схеме Apple в приведенном выше примере PrintWebView и напишите свой
UIPrintPageRenderer
чтобы установить свойства, которые вы хотите в webView.viewPrintFormatters, которые вы ему даете. - Добавьте printFormatters через:
[addPrintFormatter:startingAtPageAtIndex:]
- В вашем
UIPrintPageRenderer
-(NSInteger)numberOfPages
метод получить pageCount от каждого форматера и использовать его для обновления значений startPage и общего количества страниц.
Вот основная схема кода (FYI: это решение работает для приложения, созданного с целью развертывания iOS 9.0):
Определите свой класс UIPrintPageRenderer следующим образом (вам не нужно init
метод, но в моем случае я устанавливаю значения, которые я всегда хочу таким образом):
@interface MyPrintPageRenderer : UIPrintPageRenderer
@end
@implementation MyPrintPageRenderer
-(id)init
{
self = [super init];
if(self) {
self.headerHeight = 0;
self.footerHeight = 0;
}
return self;
}
//
// Set whatever header, footer and insets you want. It is
// important to set these values to something, so that the print
// formatters can figure out their own pageCounts for whatever
// they contain. Look at the Apple sample App for PrintWebView for
// for more details about these values.
//
-(NSInteger)numberOfPages
{
__block NSUInteger startPage = 0;
for(UIPrintFormatter *pf in self.printFormatters) {
pf.contentInsets = UIEdgeInsetsZero;
pf.maximumContentWidth = self.printableRect.size.width;
pf.maximumContentHeight = self.printableRect.size.height;
dispatch_async(dispatch_get_main_queue(), ^{
pf.startPage = startPage;
startPage = pf.startPage + pf.pageCount;
});
}
return [super numberOfPages];
}
@end
В контроллере, который обрабатывает действие печати для UIWebView, которые вы хотите распечатать, сделайте что-то вроде этого:
-(void)printWebViews
{
MyPrintPageRenderer *pr = [MyPrintPageRenderer new];
//
// Add the printFormatters at sequential startingPageIndexes,
// your renderer will set them to the correct values later based
// on the various page metrics and their content.
//
[pr addPrintFormatter:_webView1.viewPrintFormatter startingAtPageAtIndex:0];
[pr addPrintFormatter:_webView2.viewPrintFormatter startingAtPageAtIndex:1];
[pr addPrintFormatter:_webView3.viewPrintFormatter startingAtPageAtIndex:2];
// Set whatever values needed for these as per Apple docs
UIPrintInfo *pi = [UIPrintInfo printInfo];
pi.outputType = UIPrintInfoOutputGeneral;
UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];
pic.printInfo = pi;
pic.printPageRenderer = pr;
[pic presentAnimated:NO completionHandler:nil];
}
И вуаля! Теперь... это просто работает;)