今天開發MarkEditor時要用到將 UIWebView 中顯示的內容轉爲圖片,方便轉發到各個社交網絡(Twiiter,Facebook,Weibo),這樣內容就不受長度限制,相似於長微博。 以前關於視圖轉圖片我知道能夠經過 QuartzCore 裏截圖的形式,可是截圖只能截取當前屏幕所顯示的區域 (UIGraphicsGetCurrentContext()
),而 UIWebView 的內容可能比屏幕長得多,在網上搜了一下,沒有找到更好的方法,全部只用將 UIWebView 分屏截取,而後將截取的圖片拼接成一張圖片。git
- (UIImage *)imageRepresentation{ CGSize boundsSize = self.bounds.size; CGFloat boundsWidth = self.bounds.size.width; CGFloat boundsHeight = self.bounds.size.height; CGPoint offset = self.scrollView.contentOffset; [self.scrollView setContentOffset:CGPointMake(0, 0)]; CGFloat contentHeight = self.scrollView.contentSize.height; NSMutableArray *images = [NSMutableArray array]; while (contentHeight > 0) { UIGraphicsBeginImageContext(boundsSize); [self.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); [images addObject:image]; CGFloat offsetY = self.scrollView.contentOffset.y; [self.scrollView setContentOffset:CGPointMake(0, offsetY + boundsHeight)]; contentHeight -= boundsHeight; } [self.scrollView setContentOffset:offset]; UIGraphicsBeginImageContext(self.scrollView.contentSize); [images enumerateObjectsUsingBlock:^(UIImage *image, NSUInteger idx, BOOL *stop) { [image drawInRect:CGRectMake(0, boundsHeight * idx, boundsWidth, boundsHeight)]; }]; UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return fullImage; }
將 UIWebView 從頭,contentOffset = (0, 0)
,開始截取webView.bounds.size.height
高度的圖片,而後將 _webView 可見區域下移繼續截屏,這樣將全部截取的圖片按照順序拼接,就能獲得整個 UIWebView 顯示內容的完整圖片。(不知道有沒有更好的方法)github
本覺得用一樣的方法就能生成 PDF 文件web
可是經過UIGraphics
生成的 PDF 其實就是圖片,文字都無法選中,並且質量也不高,因此繼續查找其餘方法。發現UIPrintPageRenderer
能夠實現渲染視圖繪製的內容。網絡
- (NSData *)PDFData{ UIViewPrintFormatter *fmt = [self viewPrintFormatter]; UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init]; [render addPrintFormatter:fmt startingAtPageAtIndex:0]; CGRect page; page.origin.x=0; page.origin.y=0; page.size.width=600; page.size.height=768; CGRect printable=CGRectInset( page, 50, 50 ); [render setValue:[NSValue valueWithCGRect:page] forKey:@"paperRect"]; [render setValue:[NSValue valueWithCGRect:printable] forKey:@"printableRect"]; NSMutableData * pdfData = [NSMutableData data]; UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil ); for (NSInteger i=0; i < [render numberOfPages]; i++) { UIGraphicsBeginPDFPage(); CGRect bounds = UIGraphicsGetPDFContextBounds(); [render drawPageAtIndex:i inRect:bounds]; } UIGraphicsEndPDFContext(); return pdfData; }
經過這種方式生成的 PDF 質量高,與瀏覽器「打印」功能顯示出的內容同樣ui
代碼已上傳 github (https://github.com/tracy-e/UIWebViewToFile)code
======== 全文完 ============orm
Posted by XiaoYi_HD - 6月 10 2013
如需轉載,請註明: 本文來自 Esoft Mobile圖片