Использование одного или нескольких форматеров с рендерером страниц в iOS - PullRequest
2 голосов
/ 10 мая 2011

Кто-нибудь пробовал использовать несколько форматеров (UIViewPrintFormatter, UIMarkupTextPrintFormatter, UISimpleTextPrintFormatter) с рендерером страниц (UIPrintPageRenderer) для печати содержимого?

Я пытаюсь использовать два UIMarkupTextPrintFormatters с подклассом UIPrintPageRenderer, но мне не удается получить отпечаток.Я использую MyPrintPageRenderer класс из PrintWebView пример кода.

Я просмотрел документацию Apple 1015 *, но она не очень полезна, и с описанием не связано никакого примера кода.Я испробовал несколько решений, но пока не добился успеха.

Есть предложения?

Ответы [ 3 ]

5 голосов
/ 10 мая 2011

Тот факт, что в разделе «Печать» очень мало активности, говорит о том, что либо немногие люди используют это, либо люди, использующие этот 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.

1 голос
/ 03 марта 2016

Я добавляю этот дополнительный информационный ответ здесь, потому что я потратил 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;
});
0 голосов
/ 14 октября 2017

Чтобы добавить ответ @ Мустафы, startPage должен быть объявлен как:

__block NSUInteger startPage

если используется внутри блока dispatch_async

...