2010-12-17 21 views
7

非常類似於this question(還有this answer),我試圖從webview中創建一個UIImage。到目前爲止,我使用的回答表明代碼,具體是:當webview大於屏幕時,將UIWebview內容轉換爲UIImage

UIGraphicsBeginImageContext(webview.bounds.size); 
[webview.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

然而,當web視圖的內容比屏幕大,產生的圖像是不完整的,有缺失的補丁。有想法該怎麼解決這個嗎?

回答

17

我得到了答案:

你必須在網頁視圖的框架設置爲全尺寸的內容創建映像之前。在此之後,只需將尺寸設置回原點:

+ (UIImage *) imageFromWebView:(UIWebView *)view 
{ 
    // tempframe to reset view size after image was created 
    CGRect tmpFrame   = view.frame; 

    // set new Frame 
    CGRect aFrame    = view.frame; 
    aFrame.size.height = [view sizeThatFits:[[UIScreen mainScreen] bounds].size].height; 
    view.frame    = aFrame; 

    // do image magic 
    UIGraphicsBeginImageContext([view sizeThatFits:[[UIScreen mainScreen] bounds].size]); 

    CGContextRef resizedContext = UIGraphicsGetCurrentContext(); 
    [view.layer renderInContext:resizedContext]; 
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    // reset Frame of view to origin 
    view.frame = tmpFrame; 
    return image; 
} 
+0

我喜歡這麼多的脂肪酶時發佈的答案後,他們得到了它。這是流動的方式! :) – 2011-04-30 04:53:47

+0

順便說一句,我只是想知道 - 爲什麼是一個單身而不僅僅是一個函數?我是出於好奇作爲還沒有使用單身人士的人 – 2011-04-30 05:02:18

+0

我開始理解自己爲什麼不能使用' - ',但我該如何使用'+'? – 2011-04-30 05:32:37

0

我認爲這將有助於

UIGraphicsBeginImageContext([webView sizeThatFits:[[UIScreen mainScreen] bounds].size]]); 
3

D R的回答很好。唯一缺少的是考慮屏幕的比例尺。我已經糾正了我的Swift版本,它對我來說工作的很好。

extension UIWebView{ 
func snapshotForCompletePage() -> UIImage { 
    // tempframe to reset view size after image was created 
    let tmpFrame: CGRect = self.frame 
    // set full size Frame 
    var fullSizeFrame: CGRect = self.frame 
    fullSizeFrame.size.height = self.scrollView.contentSize.height 
    self.frame = fullSizeFrame 

    // here the image magic begins 
    UIGraphicsBeginImageContextWithOptions(fullSizeFrame.size, false, UIScreen.mainScreen().scale) 
    let resizedContext: CGContextRef = UIGraphicsGetCurrentContext()! 
    self.layer.renderInContext(resizedContext) 
    let image: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 
    // reset Frame of view to origin 
    self.frame = tmpFrame 
    return image 
     } 
    } 
0

@ Jibeex的回答對我有用。但我必須添加以下代碼

fullSizeFrame.size.width = self.scrollView.contentSize.width 

下面

fullSizeFrame.size.height = self.scrollView.contentSize.height 

爲它工作充分。寫作答案,因爲我沒有足夠的評論聲望。