2013-11-01 46 views
2

我有以下的打印代码,我希望它打印类连接到视图控制器的UIView的白页,空气打印生成

但印刷只是产生空白页(和两页而不是一页)

我对xcode相当陌生,你能帮我们找出错误吗?这里

UIPrintInteractionController *pc = [UIPrintInteractionController 
             sharedPrintController]; 
    UIPrintInfo *printInfo = [UIPrintInfo printInfo]; 
    printInfo.outputType = UIPrintInfoOutputGeneral; 
    printInfo.jobName = @"Print file"; 
    pc.printInfo = printInfo; 
    UIViewPrintFormatter *Pformatter = [self.view viewPrintFormatter]; 
    pc.printFormatter = Pformatter; 

    UIPrintInteractionCompletionHandler completionHandler = 
    ^(UIPrintInteractionController *printController, BOOL completed, 
     NSError *error) { 
     if(!completed && error){ 
      NSLog(@"Print failed - domain: %@ error code %u", error.domain, 
        error.code); 
     } 
    }; 
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { 
     [pc presentFromBarButtonItem:self.btnPrint animated:YES 
        completionHandler:completionHandler]; 
    } else { 
     [pc presentAnimated:YES completionHandler:completionHandler]; 
    } 

回答

4

FWIW是完整的工作代码,从iPad/iPhone的

注意任何UIView的打印位,仅打印的位图。

需要注意的是(奇怪)的iOS似乎不包括渲染一个UIView到后记的概念.. Print a UIView, but NOT by rendering as a bitmap image

换句话说以下似乎是毫无意义的iOS中,尚未...

UIViewPrintFormatter *f = [self.view viewPrintFormatter]; 

反正下面将打印(就像一个位图)任何绝对的任何UIView的...

您只需使用renderInContext:

为更现代的代码,

组合drawViewHierarchyInRect:和UIGraphicsGetImageFromCurrentImageContext()

- (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]; 
    } 

它就是这么简单,幸运的。但它是一个渲染的位图图像。