使用UIActivityViewController自定义打印

SMS*_*dat 9 objective-c uiimage ios uiactivityviewcontroller

我一直在使用UIPrintInteractionController在我的应用程序中打印图像,并且它工作得很好,因为我可以自定义页面,以便以适当的边距打印.

我正在尝试使用UIActivityViewController来做同样的事情,但是我遇到了一个块 - 每当我在activityItems中传入UIImage时,打印活动就变得可用,但是当它打印时没有利润,我不知道如何定制它.我试图使用UIMarkupTextPrintFormatter,然后它将图像打印出两页并且它的尺寸过大,因此部分图像被切断了页面.当我以NSData对象的形式传入图像时,UIPrintInteractionController似乎适当地调整了它的大小.

这是我试图在activityItems中传递的内容:

 NSString *markupText = [NSString stringWithFormat:@"<html><body><img src='%@'></body></html>",self.imgURL]; //imgURL is the url of the image on the internet
    UIMarkupTextPrintFormatter *htmlPrintF = [[UIMarkupTextPrintFormatter alloc] initWithMarkupText:markupText];
    htmlPrintF.contentInsets = UIEdgeInsetsMake(72.0, 72.0, 72.0, 72.0); // 1 inch margins
    htmlPrintF.maximumContentWidth = 6 * 72.0;
Run Code Online (Sandbox Code Playgroud)

理想情况下,我不想传递图像URL,因为下载图像时已经下载并显示一次图像需要花费时间,并保留在UIImage对象中.上面的代码为我提供了适当的边距,但图片的大小不合适,无法放在页面上.

回到使用UIPrintInteractionController并抛弃UIActivityViewController会更容易,但我希望在UIActivityViewController中将所有内容放在一个地方.

有关如何在使用UIActivityViewController时控制边距/图像大小的任何想法?

小智 7

这可能看起来像一个解决方法,但它肯定会有所帮助.

如果已下载图像-viewPrintFormatter,UIImageView则可以使用方法.您需要UIImageView在演示之前创建一个UIActivityViewController.

您可以调整contentInsets,并maximumContentWidth为您建议等.

下面的示例拍摄图像,创建imageView以调整大小并使用其printFormatter.

- (void)showActivityWithImage:(UIImage *)image
{
    UIImageView *imageview = [[UIImageView alloc] initWithImage:image];

    CGFloat aspectRatio = image.size.width / image.size.height;
    CGFloat maxWidth = 6.0f * 72.0f;

    // resize image with aspect ratio if bigger than print size
    // you can use a smarter resize here considering maxHeight also

    if (image.size.width > maxWidth)
    {
        CGFloat height = maxWidth / aspectRatio;
        [imageview setFrame:CGRectMake(0.0f, 0.0f, maxWidth, height)];
    }

    UIViewPrintFormatter *printFormatter = [imageview viewPrintFormatter];

    printFormatter.contentInsets = UIEdgeInsetsMake(72.0f, 72.0f, 72.0f, 72.0f);
    printFormatter.maximumContentWidth = maxWidth;

    // printFormatter is added only for print activity
    // image is used by others such as 'save image', 'mail'

    NSArray *activityItems = @[image, printFormatter];


    // create and present activityViewController

    UIActivityViewController *activityController;
    activityController = [[UIActivityViewController alloc] initWithActivityItems:activityItems
                                                           applicationActivities:nil];

    [self presentViewController:activityController
                       animated:YES
                     completion:nil];
}
Run Code Online (Sandbox Code Playgroud)