我在Xamarin中使用iOs默认的PrinterToPrint进行打印而没有显示选择打印机的对话框,但是它还显示了一个对话框,表示打印到[PRINTER NAME]。无论如何还要隐藏对话框。像完整的静音打印功能一样?
我不是可能的,但我看到一些应用程序这样做,我不确定他们是否使用相同的功能。
提前致谢。
答案 0 :(得分:2)
UIPrinterPickerController
来自UIKit
,因此没有办法推动"打印"进入后台并关闭主UI线程。
在当前的UIPrintInteractionController.PrintToPrinter
实现中(目前直到iOS 10.3 B4),没有公开的方法来禁用打印进度(连接,准备等...)alart / dialog(带取消按钮)或修改它的外观。
此接口是使用AirPrint
的高级包装器,因此是较低级别的Internet打印协议(IPP),用于执行打印机上的实际打印,作业队列监视等... IPP当前未公开为iOS中公开可用的框架...
允许后台打印的程序未使用UIPrintInteractionController
进行打印。 大多数确实使用UIPrinterPickerController
从用户那里获得UIPrinter
选项,但随后使用UIPrinter.Url.AbsoluteUrl
来"谈话"通过HTTP / HTTPS Post / Get直接连接到打印机。根据所使用的打印机,基于TCP的套接字也是IPP的选项,甚至是直接连接打印机的USB /串口。
回复:https://en.wikipedia.org/wiki/Internet_Printing_Protocol
选择一台打印机:
if (allowUserToSelectDifferentPrinter || printerUrl == null)
{
UIPrinter uiPrinter = printerUrl != null ? null as UIPrinter : UIPrinter.FromUrl(new NSUrl(printerUrl));
var uiPrinterPickerController = UIPrinterPickerController.FromPrinter(uiPrinter);
uiPrinterPickerController.Present(true, (printerPickerController, userDidSelect, error) =>
{
if (userDidSelect)
{
uiPrinter = uiPrinterPickerController?.SelectedPrinter;
printerUrl = uiPrinter.Url.AbsoluteUrl.ToString();
Console.WriteLine($"Save this UIPrinter's Url string for later use: {printerUrl}");
}
});
}
使用UIPrintInteractionController
打印UIPrinter
:
if (printerUrl != null)
{
// re-create a UIPrinter from a saved NSUrl string
var uiPrinter = UIPrinter.FromUrl(new NSUrl(printerUrl));
var printer = UIPrintInteractionController.SharedPrintController;
printer.ShowsPageRange = false;
printer.ShowsNumberOfCopies = false;
printer.ShowsPaperSelectionForLoadedPapers = false;
var printInfo = UIPrintInfo.PrintInfo;
printInfo.OutputType = UIPrintInfoOutputType.General;
printInfo.JobName = "StackOverflow Print Job";
var textFormatter = new UISimpleTextPrintFormatter("StackOverflow Rocks")
{
StartPage = 0,
ContentInsets = new UIEdgeInsets(72, 72, 72, 72),
MaximumContentWidth = 6 * 72,
};
printer.Delegate = new PrintInteractionControllerDelegate();
printer.PrintFormatter = textFormatter;
printer.PrintToPrinter(uiPrinter, (printInteractionController, completed, error) =>
{
if ((completed && error != null))
{
Console.WriteLine($"Print Error: {error.Code}:{error.Description}");
PresentViewController(
UIAlertController.Create("Print Error", "Code: {error.Code} Description: {error.Description}", UIAlertControllerStyle.ActionSheet),
true, () => { });
}
printInfo?.Dispose();
uiPrinter?.Dispose();
uiPrinter.
});
}
else
{
Console.WriteLine("User has not selected a printer...printing disabled");
}
答案 1 :(得分:0)
我知道这是一个有点旧的线程,但是我一直在努力为我的一个客户在iOS中实现无声打印,最后我遇到了一个易于实现的可接受的解决方案。
如已接受的答案中所述,无法摆脱显示打印进度的弹出窗口。但是有一种隐藏它的方法。您可以简单地将关键窗口的UIWindowLevel更改为UIWindowLevel.Alert +100。这将确保您当前的窗口将显示在任何警报视图上方。
但是,请注意,正如我提到的,更改级别后,它将显示在ANY警报视图上。幸运的是,您只需将此级别切换回“普通”即可获得原始行为。
所以回顾一下我的解决方案。我使用UIPrintInteractionController.PrintToPrinter以便直接打印到使用UIPrinter.FromUrl创建的打印机对象(这是Xamarin.iOS代码btw)。在执行此操作之前,我将窗口级别调整为+ 100,并且在完成打印后将窗口级别重置为“正常”。现在,我的打印过程没有向用户发出任何视觉反馈。
希望这对某人有帮助!