Использование одного или нескольких форматеров с рендерером страниц в iOS
Кто-нибудь пробовал использовать несколько форматеров (UIViewPrintFormatter
, UIMarkupTextPrintFormatter
, UISimpleTextPrintFormatter
) с рендерером страниц (UIPrintPageRenderer
) распечатать содержимое?
Я пытаюсь использовать два UIMarkupTextPrintFormatters
с UIPrintPageRenderer
подкласс, но я не могу получить печать. я использую MyPrintPageRenderer
класс из примера кода PrintWebView.
Я просмотрел документацию Apple, но она не очень полезна, и с описанием нет связанного примера кода. Я попробовал пару решений, но пока не добился успеха.
Какие-либо предложения?
3 ответа
Тот факт, что в разделе "Печать" очень мало активности, говорит о том, что либо немногие люди используют это, либо люди, использующие этот 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.
Я добавляю этот дополнительный информационный ответ сюда, потому что я потратил 2 дня на это, и ответ Мустафы спас меня. Надеемся, что все это в одном месте сэкономит другим много потерянного времени.
Я пытался выяснить, почему я не смог получить свой обычай UIPrintPageRenderer
перебирать массив viewPrintFormatter
из нескольких UIWebViews
что мне нужно напечатать в ОДНОМ задании и правильно рассчитать pageCount, как следует из документации Apple: PrintWebView
Ключ должен был добавить их через этот метод:
-(void)addPrintFormatter:(UIPrintFormatter *)formatter startingAtPageAtIndex:(NSInteger)pageIndex
а не этот:
@property(nonatomic, copy) NSArray <UIPrintFormatter *> *printFormatters
Документы Apple предполагают, что UIPrintPageRenderer
получает счетчик страниц из форматтеров печати в массиве, если на форматерах печати установлены правильные метрики, как показывает Мустафа выше. Но это работает только если вы добавляете их через addPrintFormatter:startingAtPageAtIndex:
Если вы добавите их в виде массива, printFormatters (независимо от того, какие метрики вы для них установите) вернет счетчик страниц 0!
Еще одно примечание для людей, использующих этот подход, поместите обновление в viewPrintFormatter.startPage
в dispatch_async
блок, иначе вы получите исключение:
dispatch_async(dispatch_get_main_queue(), ^{
myFormatter.startPage = startPage;
startPage = myFormatter.startPage + myFormatter.pageCount;
});
Чтобы добавить к ответу @Mustafa,startPage нужно объявить как:
__block NSUInteger startPage
если он будет использоваться внутри блока dispatch_async