Использование одного или нескольких форматеров с рендерером страниц в 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

Другие вопросы по тегам