Напечатайте UIView, но НЕ путем рендеринга как растровое изображение
Скажем, у вас есть простой UIView только с текстом (например, UILabel) и, возможно, с некоторыми черными линиями.
Вот как именно вы можете напечатать этот UIView...
сделать это как UIImage и напечатать это...
- (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];
}
Но это дает вам дерьмовые результаты. Это нелепый способ печатать типографику. Это должно быть отправлено как постскриптум, или что-то.
на экране iPad...
когда напечатано..
Обратите внимание, что, конечно, если вы используете Ipad Retina, это немного лучше, но это не главное. смешно печатать текстовую информацию, черные линии, как изображение.
Теперь, вы могли бы подумать, что вы можете напечатать UIView что-то вроде этого...
pic.printFormatter = [someUIView viewPrintFormatter];
но я не могу заставить это работать независимо от того, что я пытаюсь.
У кого-нибудь есть что-нибудь по этому поводу? Спасибо!
PS - обратите внимание, что в iOS мы недавно перешли от использования renderInContext к использованию вызова моментального снимка. Это не имеет абсолютно никакого значения для вопроса здесь, ура.
1 ответ
Как утверждает Apple Doc, атрибут viewPrintFormatter UIView определен в категории UIView, но он доступен только для экземпляров типа: UITextView, MKMapView и UIWebView.
Так что вы можете:
- напечатать UIView, используя его атрибут слоя и выравнивая все его содержимое
- инициализировать UIWebView с содержимым для печати и присвоением его атрибута viewPrintFormatter pageRenderer и отображать каждую страницу