Say you have a simple UIView with only text (ie, UILabel) and maybe some black lines.
Here's exactly how you can print that UIView...
render it as a UIImage, and print that...
- (IBAction)printB:(id)sender
{
// we want to print a normal view ... some UILabels, maybe a black line
// in this technique, depressingly we CREATE AN IMAGE of the view...
// step 1. make a UIImage, of the whole view.
UIGraphicsBeginImageContextWithOptions(self.printMe.bounds.size, NO, 0.0);
// [self.printMe.layer renderInContext:UIGraphicsGetCurrentContext()];
// UIImage *asAnImage = UIGraphicsGetImageFromCurrentImageContext();
// .... or, more futuristically.....
[self.printMe drawViewHierarchyInRect:self.printMe.bounds
afterScreenUpdates:NO];
UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// step 2. choose grayscale, etc
UIPrintInfo *info = [UIPrintInfo printInfo];
info.orientation = UIPrintInfoOrientationPortrait;
info.outputType = UIPrintInfoOutputGrayscale;
// step 3, print that UIImage
UIPrintInteractionController *pic =
[UIPrintInteractionController sharedPrintController];
pic.delegate = self;
//pic.printingItem = asAnImage;
pic.printingItem = snapshotImage;
pic.printInfo = info;
UIPrintInteractionCompletionHandler completionHandler =
^(UIPrintInteractionController *pic, BOOL completed, NSError *error)
{
if (error)
NSLog(@"failed... %@ %ld", error.domain, (long)error.code);
if (completed)
NSLog(@"completed yes");
else
NSLog(@"completed no");
};
[pic presentAnimated:YES completionHandler:completionHandler];
}
But this gives you crap results. It's a ridiculous way to print typography. It should be being sent as postscript, or something.
on iPad screen...
when printed ..
Note that, of course, if you use a retina ipad it's a bit better, but that's not the point. it's ridiculous to print text information, black lines, as an image.
Now, you'd think you could print a UIView something like this ...
pic.printFormatter = [someUIView viewPrintFormatter];
but I can't get that to work no matter what I try.
Does anyone have anything on this? Thanks!
PS - note that in iOS, we've recently changed from using renderInContext to using the snapshot call. It makes absolutely no difference to the issue here, cheers.
See Question&Answers more detail:
os