9

我一直在使用 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;

理想情况下,我不想传递图像 URL,因为当图像已经下载并显示一次并保留在 UIImage 对象中时,它会占用时间下载图像。上面的代码为我提供了适当的边距,但图像的大小不合适以适合页面。

回到使用 UIPrintInteractionController 并放弃 UIActivityViewController 会更容易,但是我希望将所有东西都放在一个地方,在 UIActivityViewController 中。

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

4

1 回答 1

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];
}
于 2014-07-09T19:40:37.407 回答