Печать содержимого нескольких UIWebViews за один раз - PullRequest
1 голос
/ 21 февраля 2011

У меня есть приложение для iPad, которое использует WebView для отображения списка URL.Я хотел бы иметь возможность печатать все WebViews за один раз, не запрашивая пользователя несколько раз с PrintInteractionController.Проблема заключается в том, что PrintInteractionController не имеет возможности сделать это.Вы не можете назначить несколько viewFormatters, и WebViews не распознаются как printItems.Я также не могу найти способ напечатать элементы и не показывать PrintInteractionController.

Кто-нибудь знает способ сделать это?

Приветствия.

Ответы [ 2 ]

1 голос
/ 21 февраля 2011

Используйте printPageRenderer свойство вашего объекта UIPrintIterationController. Вы можете установить несколько подклассов UIPrintFormatter в объекте подкласса UIPrintPageRenderer.

0 голосов
/ 03 марта 2016

Это старый вопрос, но я потратил несколько дней в поисках ответа и после некоторых вводящих в заблуждение комментариев в документации Apple и образце кода. Итак, я придерживаюсь этого здесь, чтобы спасти следующего парня в те дни, когда я потратил впустую.

Конкретная проблема: Как написать UIPrintPageRenderer, который может печатать несколько UIWebViews в одном задании на печать, переданном UIPrintInteractionController?

Вы можете довольно далеко продвинуться к решению, которое не включает в себя сначала преобразование всего в PDF-файлы, используя этот пример кода Apple: PrintWebView . Также эта документация поможет некоторым: UIPrintPageRenderer . Проблема в том, что пример приложения и документация для UPPrintPageRenderer предполагают, что если вы добавите несколько UIPrintFormatter через это свойство:

@property(nonatomic,copy) NSArray <UIPrintFormatter *> *printFormatters

Пример кода, который Apple предоставила для метода переопределения -(NSInteger)numberOfPages в PrintWebView будет просто работать и выяснить правильное количество страниц .... Неа!

То, что вам нужно сделать, это добавить printFormatters неочевидным способом с помощью метода, показанного ниже, а затем исправить их соответствующие свойства startPage и использовать их вместе, чтобы определить правильный pageCount для возврата UIPrintPageRenderer. Вместо этого используйте это:

-(void)addPrintFormatter:(UIPrintFormatter *)formatter startingAtPageAtIndex:(NSInteger)pageIndex

Почему это работает, а другой нет? Понятия не имею, вероятно, ошибка .... Я должен подать радар :) Но благодаря @ Mustafa и этому другому Stackoverflow ответу для подсказка

Ниже приведены инструкции по печати нескольких UIWebView в одном задании на печать:

  1. Следуйте указаниям Apple в приведенном выше примере PrintWebView и напишите свой UIPrintPageRenderer, чтобы установить нужные свойства для webView.viewPrintFormatters вы даете ему.
  2. Добавить printFormatters через: [addPrintFormatter:startingAtPageAtIndex:]
  3. В вашем методе UIPrintPageRenderer -(NSInteger)numberOfPages получите pageCount из каждого средства форматирования и используйте его для обновления значений startPage и общего количества страниц.

Ниже приведена основная схема кода ( К вашему сведению: это решение работает для приложения, созданного с целью развертывания iOS 9.0 ):

Определите ваш класс UIPrintPageRenderer следующим образом (вам действительно не нужен метод init, но в моем случае я устанавливаю значения, которые я всегда хочу таким образом):

@interface MyPrintPageRenderer : UIPrintPageRenderer
@end

@implementation MyPrintPageRenderer
-(id)init
{
    self = [super init];
    if(self) {
        self.headerHeight = 0;
        self.footerHeight = 0;
    }
    return self;
}

// 
// Set whatever header, footer and insets you want. It is
// important to set these values to something, so that the print
// formatters can figure out their own pageCounts for whatever
// they contain. Look at the Apple sample App for PrintWebView for
// for more details about these values.
//
-(NSInteger)numberOfPages
{
    __block NSUInteger startPage = 0;
    for(UIPrintFormatter *pf in self.printFormatters) {
        pf.contentInsets = UIEdgeInsetsZero;
        pf.maximumContentWidth = self.printableRect.size.width;
        pf.maximumContentHeight = self.printableRect.size.height;

        dispatch_async(dispatch_get_main_queue(), ^{
            pf.startPage = startPage;
            startPage = pf.startPage + pf.pageCount;
        });
    }
    return [super numberOfPages];
}
@end

В Controller , который обрабатывает действие печати для UIWebView, которые вы хотите распечатать, выполните что-то вроде этого:

-(void)printWebViews
{
    MyPrintPageRenderer *pr = [MyPrintPageRenderer new];
    //
    // Add the printFormatters at sequential startingPageIndexes,
    // your renderer will set them to the correct values later based
    // on the various page metrics and their content.
    //
    [pr addPrintFormatter:_webView1.viewPrintFormatter startingAtPageAtIndex:0];
    [pr addPrintFormatter:_webView2.viewPrintFormatter startingAtPageAtIndex:1];      
    [pr addPrintFormatter:_webView3.viewPrintFormatter startingAtPageAtIndex:2];

    // Set whatever values needed for these as per Apple docs
    UIPrintInfo *pi = [UIPrintInfo printInfo];
    pi.outputType = UIPrintInfoOutputGeneral;

    UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController];
    pic.printInfo = pi;
    pic.printPageRenderer = pr;
    [pic presentAnimated:NO completionHandler:nil];
}

И вуаля! Теперь ... это просто работает ;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...