Ответ 1
Как и в случае с документом, UIPrintFormatter нуждается во всей информации, прежде чем вычислять количество страниц для печати в формате.
UIPrintFormatter публикует интерфейс, который позволяет вам указать стартовая страница для задания на печать и поля вокруг напечатанного содержание; учитывая, что информация плюс контент, формат печати вычисляет количество страниц для задания печати.
Так что этого не произойдет, если UIPrintFormatter не начнет печатать содержимое.
Так как UIPrintPageRenderer может использовать UIPrintFormatter, он может фактически получить количество страниц, связанных с форматированием, и все, что вам нужно сделать, - это переопределить numberOfPages, чтобы настроить разные форматы на каждой странице.
Ниже приведен пример кода от Apple. Что делает то же самое - добавление нескольких форматировщиков (UIMarkupTextPrintFormatter) на каждой странице.
Здесь переопределяет numberOfPages:
- (NSInteger)numberOfPages {
self.printFormatters = nil;
[self setupPrintFormatters];
return [super numberOfPages];
}
И прикрепите форматтер к каждой странице здесь:
/*
Iterate through the recipes setting each of their html representations into
a UIMarkupTextPrintFormatter and add that formatter to the printing job.
*/
- (void)setupPrintFormatters {
NSInteger page = 0;
CGFloat previousFormatterMaxY = CGRectGetMinY(self.contentArea);
for (Recipe *recipe in recipes) {
NSString *html = recipe.htmlRepresentation;
UIMarkupTextPrintFormatter *formatter = [[UIMarkupTextPrintFormatter alloc] initWithMarkupText:html];
[formatterToRecipeMap setObject:recipe forKey:formatter];
// Make room for the recipe info
UIEdgeInsets contentInsets = UIEdgeInsetsZero;
contentInsets.top = previousFormatterMaxY + self.recipeInfoHeight;
if (contentInsets.top > CGRectGetMaxY(self.contentArea)) {
// Move to the next page
page++;
contentInsets.top = CGRectGetMinY(self.contentArea) + self.recipeInfoHeight;
}
formatter.contentInsets = contentInsets;
// Add the formatter to the renderer at the specified page
[self addPrintFormatter:formatter startingAtPageAtIndex:page];
page = formatter.startPage + formatter.pageCount - 1;
previousFormatterMaxY = CGRectGetMaxY([formatter rectForPageAtIndex:page]);
}
}
Короче говоря, он вычисляет номер страницы на основе области содержимого, вставки содержимого и затем прикрепляет форматтер к странице, вызывая API:
[self addPrintFormatter:formatter startingAtPageAtIndex:page];
Таким образом, у Renderer есть информация о форматировании для каждой страницы. Вы можете найти полный код здесь
Надеюсь, это поможет.