Ленивый рендеринг печати страниц на iOS - PullRequest
0 голосов
/ 21 февраля 2020

Мне нужно напечатать пользовательский интерфейс в кроссплатформенном приложении. На Windows рабочий процесс выглядит следующим образом:

  1. Выберите, что печатать
  2. Откройте диалоговое окно Windows Печать / предварительный просмотр. Это запрашивает только страницы печати, когда они необходимы.
  3. Начните печать и сообщайте о ходе работы при печати каждой страницы.

Я пытаюсь повторить этот рабочий процесс на iOS, но это кажется, что все страницы печати должны быть готовы к печати перед открытием диалогового окна печати iOS (UIPrintInteractionController). Это большая проблема, потому что пользователь может печатать много страниц, и каждая страница может занять некоторое время, чтобы подготовиться к печати. Поэтому подготовка и открытие UIPrintInteractionController занимает слишком много времени.

Есть ли способ на iOS лениво запрашивать страницы печати по одной (или даже несколько) за раз, когда они просматриваются или печатаются? Или все они должны быть подготовлены до представления UIPrintInteractionController?

РЕДАКТИРОВАТЬ: Это серьезная проблема при печати многих страниц, потому что он может легко исчерпать память, удерживая столько UIImages в памяти одновременно.

Я пытался использовать свойство PrintItems с UIImages, а также UIPrintPageRenderer. Я использую Xamarin. iOS, так что простите за синтаксис C#, но вы поняли идею. Ответ в Swift или Objective C будет в порядке. Вот мой пример псевдокода:

//Version 1

public void ShowPrintUI_UsingPrintingItems()
{
    UIPrintInfo printOptions = UIPrintInfo.PrintInfo;
    InitializePrintOptions(printOptions);
    _printer.PrintInfo = printOptions;

    var printRect = new CGRect(new CGPoint(), _printer.PrintPaper.PaperSize);

    //Each of these is horribly slow. 
    //Can I have it render only when the page is actually needed (being previewed or printed) ?
    for (uint i = 0; i < numPrintPages; i++)
    {
        _printPages[i] = RenderPrintPage(i, printRect);
    }

    _printer.PrintingItems = _printPages;

    _printer.Present(true, (handler, completed, error) =>
    {
        //Clean up, etc.
    });
}

//Version 2
public void ShowPrintUI_UsingPageRenderer()
{

    UIPrintInfo printOptions = UIPrintInfo.PrintInfo;
    InitializePrintOptions(printOptions);
    _printer.PrintInfo = printOptions;

    //This still draws every page in the range and is just as slow
    _printer.PrintPageRenderer = new MyRenderer();

    _printer.Present(true, (handler, completed, error) =>
    {
        //Clean up, etc.
    });
}

private class MyRenderer : UIPrintPageRenderer
{
    public MyRenderer(IIosPrintCallback callback)
    {
        _callback = callback;
    }

    public override void DrawPage(nint index, CGRect pageRect)
    {
        DrawPrintPage(i, printRect);
    }

    public override nint NumberOfPages => _numPrintPages;
}
...