0

我需要在跨平台应用程序中打印自定义 UI。在 Windows 上,工作流程如下:

  1. 选择要打印的内容
  2. 打开 Windows 打印对话框/打印预览。这仅在需要时查询打印页面。
  3. 开始打印并在打印每一页时报告进度。

我正在尝试在 iOS 上复制此工作流程,但似乎所有打印页面都需要在打开 iOS 打印对话框 (UIPrintInteractionController) 之前准备好打印。这是一个大问题,因为用户可能要打印很多页,而每一页都可能需要一段时间来准备打印。因此,准备和打开 UIPrintInteractionController 需要很长时间。

在 iOS 上是否有任何方法可以在预览或打印时一次懒惰地查询一个(甚至几个)打印页面?还是他们都必须在展示 UIPrintInteractionController 之前做好准备?

编辑:打印多页时这是一个主要问题,因为它很容易耗尽内存,同时在内存中保存这么多 UIImage。

我尝试将 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;
}
4

0 回答 0