使用UIActivityViewController自定义打印

时间:2013-11-13 21:58:21

标签: ios objective-c uiimage 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;

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

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

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

1 个答案:

答案 0 :(得分:7)

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

如果您已下载图片,则可以使用-viewPrintFormatter UIImageView方法。在呈现UIImageView之前,您需要创建UIActivityViewController

您可以按照建议调整contentInsetsmaximumContentWidth等。

下面的示例拍摄一张图片,创建一个用于调整大小的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];
}