iphone - Photo Size With UIPrintInteractionController -
i have 1 problem print photo using airprint. printed 4 * 6 inch image printed image size large! how can resolve problem.
can specify paper size , photo programmatically?
here screen shot url.
https://www.dropbox.com/s/1f6wa0waao56zqk/img_0532.jpg
` here code
-(void)printphotowithimage:(uiimage *)image { nsdata *mydata = uiimagejpegrepresentation(image, 1.f); uiprintinteractioncontroller *pic = [uiprintinteractioncontroller sharedprintcontroller]; if (pic && [uiprintinteractioncontroller canprintdata:mydata]) { pic.delegate = self; uiprintinfo *pinfo = [uiprintinfo printinfo]; pinfo.outputtype = uiprintinfooutputphoto; pinfo.jobname = @"my photo"; pinfo.duplex = uiprintinfoduplexlongedge; pic.printinfo = pinfo; pic.showspagerange = yes; pic.printingitem = mydata; pic.printformatter = format; [format release]; void(^completionhandler)(uiprintinteractioncontroller *, bool, nserror *) = ^(uiprintinteractioncontroller *print, bool completed, nserror *error) { [self resignfirstresponder]; if (!completed && error) { nslog(@"--- print error! ---"); } }; [pic presentfromrect:cgrectmake((self.view.bounds.size.width - 64) + 27, (self.view.bounds.size.height - 16) + 55, 0, 0) inview:self.view animated:yes completionhandler:completionhandler]; } } - (uiprintpaper *)printinteractioncontroller:(uiprintinteractioncontroller *)printinteractioncontroller choosepaper:(nsarray *)paperlist { cgsize pagesize = cgsizemake(6 * 72, 4 * 72); return [uiprintpaper bestpaperforpagesize:pagesize withpapersfromarray:paperlist]; } just code. should use uiprintpagerenderer property give draw area?
`
first should set
/* printphotopagerenderer *pagerenderer = [[printphotopagerenderer alloc]init]; pagerenderer.imagetoprint =image; pic.printpagerenderer = pagerenderer; */ - (void)printimage { // obtain shared uiprintinteractioncontroller uiprintinteractioncontroller *controller = [uiprintinteractioncontroller sharedprintcontroller]; controller.delegate = self; if(!controller){ nslog(@"couldn't shared uiprintinteractioncontroller!"); return; } // need completion handler block printing. uiprintinteractioncompletionhandler completionhandler = ^(uiprintinteractioncontroller *printcontroller, bool completed, nserror *error) { if(completed && error) nslog(@"failed! due error in domain %@ error code %u", error.domain, error.code); }; // obtain printinfo can set our printing defaults. uiprintinfo *printinfo = [uiprintinfo printinfo]; uiimage *image = ((uiimageview *)self.view).image; [controller setdelegate:self]; printinfo.outputtype = uiprintinfooutputphoto; if(!controller.printingitem && image.size.width > image.size.height) printinfo.orientation = uiprintinfoorientationlandscape; // use printinfo print job. controller.printinfo = printinfo; // since code below relies on printingitem being 0 if hasn't // been set, code sets nil. controller.printingitem = nil; #if direct_submission // use url of image asset. if(self.imageurl && [uiprintinteractioncontroller canprinturl:self.imageurl]) controller.printingitem = self.imageurl; #endif // if aren't doing direct submission of image or reason don't // have alasset or url our image, we'll draw instead. if(!controller.printingitem){ // create instance of our printphotopagerenderer class use // printpagerenderer print job. printphotopagerenderer *pagerenderer = [[printphotopagerenderer alloc]init]; // printphotopagerenderer subclass needs image draw. if taking // path use original image , not fullscreenimage obtained // alassetrepresentation. //pagerenderer.imagetoprint = ((uiimageview *)self.view).image; pagerenderer.imagetoprint =image; controller.printpagerenderer = pagerenderer; } // method use presenting printing ui depends on type of // ui idiom executing. once invoke 1 of these methods // present printing ui, our application's direct involvement in printing // complete. our delegate methods (if any) , page renderer methods (if any) // invoked uikit. if (ui_user_interface_idiom() == uiuserinterfaceidiompad) { //[controller presentfrombarbuttonitem:self.printbutton animated:yes completionhandler:completionhandler]; // ipad [controller presentfromrect:cgrectmake(0, 0, 50, 50) inview:_btnprint animated:yes completionhandler:completionhandler]; }else [controller presentanimated:yes completionhandler:completionhandler]; // iphone } and should set printphotopagerenderer
uiprintpagerenderer.h
#import <uikit/uikit.h> @interface printphotopagerenderer : uiprintpagerenderer { uiimage *imagetoprint; } @property (readwrite, retain) uiimage *imagetoprint; @end // printphotopagerenderer.m
#import "printphotopagerenderer.h" @implementation printphotopagerenderer @synthesize imagetoprint; // code draws 1 image @ print time. -(nsinteger)numberofpages { return 1; } /* when using uiprintpagerenderer subclass draw photo @ print time, app explicitly draws content , need override drawpageatindex:inrect: accomplish that. following scaling algorithm implemented here: 1) on borderless paper, users expect see content scaled there no whitespace @ edge of paper. code scales content fill paper @ expense of clipping content lies off paper. 2) on paper not borderless, code scales content fills paper. reduces size of photo not clip content. */ - (void)drawpageatindex:(nsinteger)pageindex inrect:(cgrect)printablerect { if(self.imagetoprint){ cgsize finialsize = cgsizemake(560, 431);//you should set width , height self int x = 20; int y = (printablerect.size.height - finialsize.height); cgrect finalrect = cgrectmake(x, y, finialsize.width, finialsize.height); [self.imagetoprint drawinrect:finalrect]; }else { nslog(@"%s no image draw!", __func__); } } @end
Comments
Post a Comment