我需要在跨平台应用程序中打印自定义 UI。在 Windows 上,工作流程如下:
- 选择要打印的内容
- 打开 Windows 打印对话框/打印预览。这仅在需要时查询打印页面。
- 开始打印并在打印每一页时报告进度。
我正在尝试在 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;
}