2

我正在尝试使用 UIPrintInteractionController.PrintingItems 打印多个标签,但是当加载图像时它会填满页面,是否可以使用此方法在一个页面上显示多个图像,或者是否有另一种方法可以为我提供更好的解决方案?谢谢。

  void Print()
    {
        var printInfo = UIPrintInfo.PrintInfo;
        printInfo.OutputType = UIPrintInfoOutputType.General;
        printInfo.JobName = "Label Printing";

        //UIPrintFormatter formatter = new UIPrintFormatter()
        //{
        //    StartPage = 0,
        //    ContentInsets = new UIEdgeInsets(72, 72, 72, 72),
        //    MaximumContentWidth = 6 * 72,

        //};

        int labelAmount = 10;
        int x;
        NSObject[] labelItems = new NSObject[labelAmount];
        for (x = 0; x < labelAmount; x++)
        {
            labelItems[x] = UIImage.FromFile("Images/BMcAzurri.png");
        }

        UIPrintInteractionController printer = UIPrintInteractionController.SharedPrintController;
        printer.PrintInfo = printInfo;
        //printer.PrintFormatter = formatter;
        printer.PrintingItems = labelItems;
        printer.ShowsPageRange = true;
        printer.Present(true, (handler, completed, err) => {
            if (!completed && err != null)
            {
                Console.WriteLine("error");
            }
        });
    }
4

1 回答 1

1

有几种方法可以满足您的要求,这只是一种使用图形上下文进行打印页面渲染的方法。

  • 将图像加载到UIImage实例中
    • 您可能想要预缩放/重新缩放该图像
  • 创建一个UIView足够大以包含该图像的所有行和列的
  • 为您的“打印页面”上的每一行/列创建一个UIImageView包含您的图像的图像,并将其放置在此视图中的正确位置
  • 使用 Image 渲染上下文,将UIView包含图像的内容转换为 aUIImage并排队并根据需要打印尽可能多的内容...

例子:

var printInfo = UIPrintInfo.PrintInfo;
printInfo.OutputType = UIPrintInfoOutputType.General;
printInfo.JobName = "Label Printing";

var uiImage = UIImage.FromFile("BingWallpaper-2017-05-04.jpg");
var noColumns = 2;
var noRows = 2;
var gapBetweenImages = 25;
int noOfPages = 2;
NSObject[] labelItems = new NSObject[noOfPages];
for (int x = 0; x < noOfPages; x++)
{
    var aPrintView = new UIView
    {
        Frame = new CGRect(0, 0, (uiImage.Size.Width * noColumns) + ((noColumns + 1) * gapBetweenImages), (uiImage.Size.Height) * noRows + ((noRows + 1) * gapBetweenImages))
    };
    for (int column = 0; column < noColumns; column++)
    {
        for (int row = 0; row < noRows; row++)
        {
            var printImage = new UIImageView(uiImage)
            {
                Frame = new CGRect((column * gapBetweenImages) + (column * uiImage.Size.Width), (row * gapBetweenImages) + (row * uiImage.Size.Height), uiImage.Size.Width, uiImage.Size.Height)
            };
            aPrintView.Add(printImage);
        }
    }
    UIGraphics.BeginImageContext(aPrintView.Bounds.Size);
    aPrintView.Layer.RenderInContext(UIGraphics.GetCurrentContext());
    var aPageImage = UIGraphics.GetImageFromCurrentImageContext();
    UIGraphics.EndImageContext();
    labelItems[x] = aPageImage;
}

UIPrintInteractionController printer = UIPrintInteractionController.SharedPrintController;
printer.PrintInfo = printInfo;
printer.PrintingItems = labelItems;
printer.ShowsPageRange = true;
printer.Present(true, (handler, completed, err) =>
{
    if (!completed && err != null)
    {
        Console.WriteLine("error");
    }
});

笔记: !!!这不是处理清理工作,请确保Dispose完成后的所有事情......

注意:这只是一个简单的示例,不处理图像与纸张大小的纵横比,您需要根据您要打印的内容以及打印机/纸张的类型来考虑...

注意:如果您要渲染多个文本字段与图像,您可能希望渲染为 PDF vs aUIImage并打印出来。

在此处输入图像描述

于 2017-05-04T20:41:04.893 回答