2009-01-22 58 views
9

我正在嘗試捕獲UIWebView的內容,包括對用戶不可見的內容。即整個網頁,即使用戶只看頂部。將UIWebView呈現到ImageContext中

四處尋找我發現捕獲UIView的最佳方式是檢索其圖層並使用renderInContext。

但是,UIWebView似乎正在使用自己的CALayer實現,它的表現更像CATiledLayer,雖然它仍然聲稱是標準的CALayer。當我打電話給renderInContext時,我只能得到網頁的一部分,最多940px,而不是整個頁面。

有沒有人有任何想法如何強制UIWebView向下滾動另一個940px(顯然這是遠遠不夠理想)或告訴任何品種的CALayer它支持WebView呈現其所有內容時,我問它來。

乾杯

編輯:我要補充一點,目前改變的WebView的框架以適應通過JavaScript檢索頁面大小。

回答

1

它在我看來像UIWebView根據需要呈現(當在大頁面上快速向下滾動時見證棋盤),因此在用戶滾動之前,在圖層下方的部分中不會有任何東西在下面。圖層將無法寫出它沒有的圖像,所以我認爲你不能捕捉整個區域。

至於滾動,沒有任何明顯暴露的API方法,我可以想到將它移下來。 Web視圖似乎託管一個UIScrollView或類似的東西,你可以通過遍歷視圖層次結構並使用它的scrollRectToVisible:animated:來嘗試訪問,但這聽起來不是一個好的長期解決方案。

+0

呀web視圖充當如果它有CATiledLayer,並且一次只呈現大塊,如果它是一個真正的CATiledLayer它不會是那麼糟糕,因爲我可以設置瓷磚的大小,但不幸的是,情況並非如此。 我正在試圖滾動圖層,但它不喜歡那個。 – 2009-01-23 09:25:03

1

只是爲了回答我的一個問題,您可以使用javascript滾動視圖。

因此,您使用stringByEvaluatingJavaScriptFromString:以javascript的window.scrollTo(0,%i);,其中%i是您要滾動到的位置。您也可以使用scrollY來檢索當前的滾動值。

0

所有UIViews都有1024x1024的大小限制,所以你可能會以編程方式滾動,以大塊的形式捕捉頁面,並以某種方式將它們縫合在一起。

9

我已經發布了一個應用程序(Web2Pic),請相信我,UIGraphicsBeginImageContext(webView.frame.size); 可以什麼都不做,除了在我們的UIWebView ;-(

正確的做法是有點複雜的可視區域越來越小圖像,但它只是工作:

1.使用的JavaScript在我們的UIWebView得到這些浮點值:。

//Whole page size in HTML coordinate 
    document.body.scrollWidth 
    document.body.scrollHeight 
    //UIWebView visible size in HTML coordinate 
    window.innerWidth 
    window.innerHeight 

2.Now我們可以「切割」整個頁面分成幾十個UIWebView的大小的小片,然後我們就可以分別捕捉每一個小塊,然後把它們保存到我們的緩存我實現這通過計算ting page-offset並使用UIGraphicsBeginImageContext(webView.frame.size);獲取圖像數組。另外,您應該將圖像數組緩存到文件系統中,否則應用程序最終會崩潰!我們可以開始一個全分辨率的上下文:UIGraphicsBeginImageContext(CGSizeMake(document.body.scrollWidth,document.body.scrollHeight));

4.Render每一個細小的圖像轉換爲基於座標的大背景下。而小心角落,在每一行的最後一個圖像/行可能不是一個完整的圖像。

俗語仍是一步到位左:保存大的圖像。 不要將其保存到天地我的相簿,因爲iOS的會自動降低圖像的相冊中的分辨率。相反,我們可以將其保存到文件系統,使應用程序的iTunes的文件共享支持,甚至寫一個簡單的應用程序內的照片管理器。

希望這些可以幫助;-)

已超峯季

+1

在步驟2中,您是否必須手動滾動網頁視圖?如果是這樣,你如何做到這一點?正如Dany Greg在之前的評論中所說的那樣? – vIceBerg 2011-10-10 22:15:27

2

設置的webview等於的webviewscrollviewcontentsize高度。

-(UIImage *)captureImage:(UIWebView *)webvw 
{ 
    webvw.frame=CGRectMake(webvw.frame.origin.x, webvw.frame.origin.y, webvw.frame.size.width, webvw.scrollView.contentSize.height); 
    UIGraphicsBeginImageContextWithOptions(webvw.frame.size, NO, 0.0f); 
    [webvw.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext(); 
    return screenshot; 
} 
1

調整Webview的大小是我解決問題的方法。如果你想要更大的圖像和更多的細節,你只需要在調用這個方法之前放大。請注意,大尺寸會影響性能。

- (UIImage*) imageFromWebview:(UIWebView*) webview{ 

//store the original framesize to put it back after the snapshot 
CGRect originalFrame = webview.frame; 

//get the width and height of webpage using js (you might need to use another call, this doesn't work always) 
int webViewHeight = [[webview stringByEvaluatingJavaScriptFromString:@"document.body.scrollHeight;"] integerValue]; 
int webViewWidth = [[webview stringByEvaluatingJavaScriptFromString:@"document.body.scrollWidth;"] integerValue]; 

//set the webview's frames to match the size of the page 
[webview setFrame:CGRectMake(0, 0, webViewWidth, webViewHeight)]; 

//make the snapshot 
UIGraphicsBeginImageContextWithOptions(webview.frame.size, false, 0.0); 
[webview.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

//set the webview's frame to the original size 
[webview setFrame:originalFrame]; 

//and VOILA :) 
return image; 

}