37

I'm using UIPrintInteractionController presenting it from rect.

UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];
// than set printing settings
...
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    [controller presentFromRect:rect inView:view animated:YES completionHandler:completionHandler];

Than I set number of pages (>1) and select a printer. Before devices rotation I call

[controller dismissAnimated:animated];

according to Xcode documentation: You should dismiss the printing options when they are presented in a sheet or animated from a rectangle and the user changes the orientation of the device.

When I present UIPrintInteractionController after rotation, the number of printing copies is set back to 1 (as in initial view), whereas printer remains selected. Ivar _copies of UIPrintInfo is private, so I can't get it and store during rotation.

How can I restore the number of printing pages after rotation?

Moin Shirazi
  • 4,372
  • 2
  • 26
  • 38
Anastasia
  • 3,024
  • 1
  • 23
  • 34
  • why you dismissing it on rotation? – NeverBe Nov 05 '12 at 15:45
  • 4
    @NeverBe because Apple recommends to do it in description of `dismissAnimated:` method of `UIPrintInteractionController` class. "You should dismiss the printing options when they are presented in a sheet or animated from a rectangle and the user changes the orientation of the device." and "You should then present the printing options again once the new orientation takes effect." – Anastasia Nov 05 '12 at 15:53
  • 1
    Here's a [link to `UIPrintInteractionController` class](https://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIPrintInteractionController_Class/Reference/Reference.html). – Anastasia Nov 05 '12 at 16:18
  • Ever figure out an answer to this? – Ryan Poolos Jan 31 '13 at 01:52
  • @RyanPoolos Still not, have you got any ideas? – Anastasia Jan 31 '13 at 21:53
  • Are you by chance recreating the UIPrintInteractionController upon rotation? – jjxtra Mar 22 '13 at 16:38
  • @PsychoDad I use only [UIPrintInteractionController sharedPrintController], and it returns the same object every time. – Anastasia Mar 22 '13 at 18:25

4 Answers4

1

Sorry this may seem a bit of an obvious question but have you called it as a delegate?

UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];
controller.delegate = self;
Joe Barbour
  • 842
  • 9
  • 14
1
[printInfo setValue:[NSNumber numberWithInteger:numberFile] forKey:@"copies"]

You can set and set @"copies" of UIPrintInfo

Nam Vu
  • 5,669
  • 7
  • 58
  • 90
-1
- (void)printImage:(id)sender {
  // Obtain the shared UIPrintInteractionController
  UIPrintInteractionController *controller = [UIPrintInteractionController sharedPrintController];
  if(!controller){
    NSLog(@"Couldn't get shared UIPrintInteractionController!");
    return;
  }

  // We need a completion handler block for printing.
  UIPrintInteractionCompletionHandler completionHandler = ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
    if(completed && error)
      NSLog(@"FAILED! due to error in domain %@ with error code %u", error.domain, error.code);
  };

      // Obtain a printInfo so that we can set our printing defaults.
    for(int i=0;i<[paths count];i++)
    {
        NSString *strFilePath = [paths objectAtIndex:i];
        NSLog(@"@ strFilePath is %@", strFilePath);
        NSData *data = [NSData dataWithContentsOfFile:strFilePath];
        if(data)
        {
            image = [UIImage imageWithData:data];
           // [arrayOfImages addObject:image];
               NSLog(@"@ image is %@", image);
            UIPrintInfo *printInfo = [UIPrintInfo printInfo];

            // This application prints photos. UIKit will pick a paper size and print
            // quality appropriate for this content type.
            printInfo.outputType = UIPrintInfoOutputPhoto;
            // The path to the image may or may not be a good name for our print job


            printInfo.jobName = @"PNg";
            NSLog(@"@ imageURL is %@",  printInfo.jobName);
            //  printInfo.jobName


            if(!controller.printingItems && image.size.width > image.size.height)
                printInfo.orientation = UIPrintInfoOrientationLandscape;

            // Use this printInfo for this print job.
            controller.printInfo = printInfo;


            controller.printingItems = nil;

        }
    }





#if DIRECT_SUBMISSION
  // Use the URL of the image asset.
    if(self.imageURL && [UIPrintInteractionController canPrintURL:self.imageURL])
      controller.printingItem = self.imageURL;
#endif

  // If we aren't doing direct submission of the image or for some reason we don't
  // have an ALAsset or URL for our image, we'll draw it instead.
  if(!controller.printingItems){
    // Create an instance of our PrintPhotoPageRenderer class for use as the
    // printPageRenderer for the print job.
    PrintPhotoPageRenderer *pageRenderer = [[PrintPhotoPageRenderer alloc]init];

    pageRenderer.imageToPrint = image;
    controller.printPageRenderer = pageRenderer;
    [pageRenderer release];
  }


  if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    [controller presentFromBarButtonItem:self.printButton animated:YES completionHandler:completionHandler];  // iPad
  }else
    [controller presentAnimated:YES completionHandler:completionHandler];  // iPhone

}
-1

If I understand you correctly, what you really need is how to run code before and after orientation changes:

In swift:

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransition(to: size, with: coordinator)

    //code goes here to run before orientation change 

    coordinator.animate(alongsideTransition: nil, completion: {
        _ in

        //code goes here to run after orientation change 
    })

}

Obj C docs:

mhill
  • 35
  • 2