Тот факт, что в разделе «Печать» очень мало активности, говорит о том, что либо немногие люди используют это, либо люди, использующие этот API, не посещают это сообщество, либо люди просто почему-то игнорируют вопрос.
В любом случае, я смог решить мою проблему.Я использовал setPrintFormatters:
метод ранее, который не работал / не работает.Я не знаю почему.Итак, я начал экспериментировать с методом addPrintFormatter:startingAtPageAtIndex:
.И вот как я решил свою проблему:
// To draw the content of each page, a UIMarkupTextPrintFormatter is used.
NSString *htmlString = [self prepareWebViewHTML];
UIMarkupTextPrintFormatter *htmlFormatter = [[UIMarkupTextPrintFormatter alloc] initWithMarkupText:htmlString];
NSString *listHtmlString = [self prepareWebViewListHTMLWithCSS];
UIMarkupTextPrintFormatter *listHtmlFormatter = [[UIMarkupTextPrintFormatter alloc] initWithMarkupText:listHtmlString];
// I think this should work, but it doesn't! The result is an empty page with just the header and footer text.
// [myRenderer setPrintFormatters:[NSArray arrayWithObjects:htmlFormatter, listHtmlFormatter, nil]];
// Alternatively, i've used addPrintFormatters here, and they just work!
// Note: See MyPrintPageRenderer's numberOfPages method implementation for relavent details.
// The important point to note there is that the startPage property is updated/corrected.
[myRenderer addPrintFormatter:htmlFormatter startingAtPageAtIndex:0];
[myRenderer addPrintFormatter:listHtmlFormatter startingAtPageAtIndex:1];
В MyPrintPageRenderer
я использовал следующий код для обновления / исправления свойства startPage, чтобы для каждого форматера использовалась новая страница:
- (NSInteger)numberOfPages
{
// TODO: Perform header footer calculations
// . . .
NSUInteger startPage = 0;
for (id f in self.printFormatters) {
UIPrintFormatter *myFormatter = (UIPrintFormatter *)f;
// Top inset is only used if we want a different inset for the first page and we don't.
// The bottom inset is never used by a viewFormatter.
myFormatter.contentInsets = UIEdgeInsetsMake(0, leftInset, 0, rightInset);
// Just to be sure, never allow the content to go past our minimum margins for the content area.
myFormatter.maximumContentWidth = self.paperRect.size.width - 2*MIN_MARGIN;
myFormatter.maximumContentHeight = self.paperRect.size.height - 2*MIN_MARGIN;
myFormatter.startPage = startPage;
startPage = myFormatter.startPage + myFormatter.pageCount;
}
// Let the superclass calculate the total number of pages
return [super numberOfPages];
}
Я до сих пор не знаю, есть ли способ ПРИЛОЖИТЬ печатный контент как htmlFormatter, так и listHtmlFormatter (используя этот подход).например, вместо использования новой страницы для listHtmlFormatter, продолжайте печать с того места, где заканчивается htmlFormatter.