我一直在使用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时控制边距/图像大小的任何想法?
答案 0 :(得分: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];
}