Question

I got uisplitviewcontroller and it's working almost flawless how ever i implantent a way for th user to print using AirPrint... i had to implant it on every Detail storyboard how ever and make navigation bar not appear and then write in the AirPrint method. i wanted to know if theres anyway to do this properly in my seneario i lose the popupcontroller that navigates back to Index in the uitableview and i want to be able to have a "back" button and print from all Details i have

my AirPrint code :

- (void)printWebView:(id)sender {

UIGraphicsBeginImageContext(self.view.bounds.size);{
    CGPoint savedContentOffset = scrollView.contentOffset;
    CGRect savedFrame = scrollView.frame;

    scrollView.contentOffset = CGPointZero;
    scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height);

    [scrollView.layer renderInContext: UIGraphicsGetCurrentContext()];

    scrollView.contentOffset = savedContentOffset;
    scrollView.frame = savedFrame;
}
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

UIPrintInteractionController *printer = [UIPrintInteractionController sharedPrintController];
printer.printingItem = viewImage;

UIPrintInfo *info = [UIPrintInfo printInfo];
info.orientation = UIPrintInfoOrientationLandscape;
info.outputType = UIPrintInfoOutputGeneral;
printer.printInfo = info;

UIPrintInteractionCompletionHandler completionHandler =
^(UIPrintInteractionController *pic, BOOL completed, NSError *error) {
if (!completed && error)
    NSLog(@"FAILED! due to error in domain %@ with error code %ld: %@",
          error.domain, (long)error.code, [error localizedDescription]);
};

if (IDIOM == IPAD)
[printer presentFromBarButtonItem:sender animated:YES completionHandler:completionHandler];
else
[printer presentAnimated:YES completionHandler:completionHandler];
}

my navigation "sorta" can't set navigation bar to NO because then i won't print the current Detail and instead takes the first detail "Top"

-(void)mineSygedomme:(int)viewId {
UIViewController *viewController;
switch (viewId) {
    case 0:
        viewController = self.vaccinationer;
        [self.navigationController setNavigationBarHidden:YES animated:NO];
        break;
    case 1:
        viewController = self.skadestuen;
        [self.navigationController setNavigationBarHidden:YES animated:NO];
        break;
    case 2:
        viewController = self.leagen;
        [self.navigationController setNavigationBarHidden:YES animated:NO];
        break;
}
[self showChildViewController:viewController];
}
-(void)showViewWithId:(int)viewId {
UIViewController *viewController;
switch (viewId) {
    case 0:
        viewController = self.startSide;
        break;
}
[self showChildViewController:viewController];

}

i tried using this code on the other Details but it wouldn't work

#pragma mark - Split view

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
    barButtonItem.title = NSLocalizedString(@"Hovedmenu", @"Hovedmenu");
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
self.masterPopoverController = popoverController;
}

- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem

{

// Called when the view is shown again in the split view, invalidating the button and popover controller.
[self.navigationItem setLeftBarButtonItem:nil animated:YES];
self.masterPopoverController = nil;
}

i think i need a way to get current Detail/Storybord and then i can print from it but don't know how to do this

Was it helpful?

Solution

figured it out atlast ! had to change they way the AirPrint works. so it takes a screenshot of uiview and then prints that

- (void)printWebView:(id)sender {

UIGraphicsBeginImageContextWithOptions(self.view.frame.size, NO, 0.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

CGRect rect=self.view.frame;


CGImageRef cropped1 = CGImageCreateWithImageInRect(viewImage.CGImage, rect);
UIImage *imges =  [UIImage imageWithCGImage:cropped1];
CGImageRelease(cropped1);
// squarecropimg.image=imges;

NSData *date=UIImagePNGRepresentation(imges);
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *doc = [paths objectAtIndex:0];
NSString *appstr = [doc stringByAppendingPathComponent:@"currentview.png"];
[date writeToFile:appstr atomically:YES];

UIPrintInteractionController *printer = [UIPrintInteractionController sharedPrintController];
printer.printingItem = viewImage;

UIPrintInfo *info = [UIPrintInfo printInfo];
info.orientation = UIPrintInfoOrientationLandscape;
info.outputType = UIPrintInfoOutputGeneral;
printer.printInfo = info;

UIPrintInteractionCompletionHandler completionHandler =
^(UIPrintInteractionController *pic, BOOL completed, NSError *error) {
    if (!completed && error)
        NSLog(@"FAILED! due to error in domain %@ with error code %ld: %@",
              error.domain, (long)error.code, [error localizedDescription]);
};

if (IDIOM == IPAD)
    [printer presentFromBarButtonItem:sender animated:YES completionHandler:completionHandler];
else
    [printer presentAnimated:YES completionHandler:completionHandler];
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top