2012-06-10 8 views
0

간단한 작업을 수행하려고합니다. 있는 UIImage에있는 UIWebView의 내용을 변환 그러나 나는 유사한 오류가의 무리에게 다음과 같은 코드가 실행될 때마다 점점 계속, 휴대 전화의 문서 디렉토리에 저장 :UIWebView UIImage 잘못된 컨텍스트 0x0

:

UIGraphicsBeginImageContext(rect.size); 
    [self.webView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

는 다음과 같은 오류를 생성을

Jun 10 20:06:18 <Error>: CGContextSaveGState: invalid context 0x0 
Jun 10 20:06:18 <Error>: CGContextSetAlpha: invalid context 0x0 
Jun 10 20:06:18 <Error>: CGContextSaveGState: invalid context 0x0 
Jun 10 20:06:18 <Error>: CGContextSetFillColorWithColor: invalid context 0x0 
Jun 10 20:06:18 <Error>: CGContextAddRect: invalid context 0x0 
Jun 10 20:06:18 <Error>: CGContextDrawPath: invalid context 0x0 

나는 약간의 연구를했는데 이것이 위의 코드가 drawRect :(CGRect) rect 메서드에 없기 때문에 발견되었다. 그러나 UIWebView가 초기화 된 후 어떻게 호출해야합니까? 나는 그것을 수동으로 부르지 않습니까?

내가 HTML을 생성하고 웹보기에로드하기 위해 사용하고 코드입니다 :이 functon에게 사용의 drawRect에있을 필요가 없습니다 그것은 아니

-(void)saveHTMLDocument { 

    NSMutableString *htmlDocumentToSave = [[NSMutableString alloc] initWithString:@"<html><body>"]; 
    [htmlDocumentToSave appendString:@"<table border=""1""><tr><th>Snag Number</th><th>Snag Photo</th><th>Snag Description</th><th>Date Taken</th>"]; 

    for (int i = 0; i < self.fetchedResultsController.fetchedObjects.count; i++) { 

    NSData *imageData = [NSData dataWithData:UIImagePNGRepresentation([self.photoArray objectAtIndex:i])]; 
    NSString *base64String = [imageData base64EncodedString]; 

    Snag *snag = [self.fetchedResultsController.fetchedObjects objectAtIndex:i]; 

    NSString *tableString = [NSString stringWithFormat:@"<tr><td>%i</td><td><p><b><img src='data:image/png;base64,%@'></b></p></td><td>%@</td><td>%@</td></tr>", i+1, base64String, snag.snagDescription, snag.dateTaken]; 
    [htmlDocumentToSave appendString:tableString]; 

    } 

    [htmlDocumentToSave appendString:@"</table></body></html>"]; 


    //Save the HTMl document that will be attached. 
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsPath = [paths objectAtIndex:0]; 

    NSString *htmlPath = [documentsPath stringByAppendingPathComponent:@"test"]; 
    [htmlDocumentToSave writeToFile:htmlPath atomically:NO encoding:NSUTF8StringEncoding error:nil]; 
    self.htmlData = [NSData dataWithContentsOfFile:htmlPath]; 

    //Generate the UIWebView and load the HTML into it 

    NSString *htmlFile = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"]; 

    NSData *htmlData = [NSData dataWithContentsOfFile:htmlFile]; 

    self.webView = [[UIWebView alloc] init]; 
    [self.webView loadData:htmlData MIMEType:@"text/html" textEncodingName:@"UTF-8" baseURL:[NSURL URLWithString:@""]]; 

    NSString *string = [self.webView stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('html')[0].innerHTML"]; 

    NSLog(@"Check if WebView has loaded %@", string); 



} 

-(void)drawRect:(CGRect)rect { 

    UIGraphicsBeginImageContext(rect.size); 
    [self.webView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
} 

답변

2

+(UIImage*)captureScreen:(UIView*) viewToCapture 
{ 
    UIGraphicsBeginImageContextWithOptions(viewToCapture.bounds.size, viewToCapture.opaque, 0.0); 
    [viewToCapture.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return viewImage; 
} 

내 응용 프로그램에서 내 WebView의 스크린 샷을 올바르게 가져옵니다.

+0

최근에 시도하지는 않았지만이 기술은 UIWebViews와 함께 사용하는 경우 이전 버전의 iOS에서는 비정상이었습니다. 또 다른 잠재적 인 문제는 UIWebView가 콘텐츠 표시를 완료했을 때를 파악하는 것입니다. – EricS

+0

예, 실제로 Webview로드가 완료된 후 300 - 500 밀리 초가 걸리는 경향이 있습니다. iOS 4.3 및 5.1에서이 기능을 사용하고 있으며, 현재 잘 작동합니다. ePub 뷰어에서 페이지 전환 애니메이션을 적용하는 데 매우 효과적입니다. good –

+0

감사합니다. Omar, 빠른 질문 하나, 어떻게 그 방법을 호출 할 수 있습니까? – jcrowson

1

rect.size은 무엇입니까? 너비 또는 높이가 0이면 CG는 컨텍스트를 만들 수 없으므로 사용자가보고있는 종류의 오류가 발생합니다.

@OmarAbdelhafith는 나머지 부분에 대해서는 정확합니다. -drawRect:에서이 작업을 수행 할 필요가 없으며 나머지 코드는 정상적으로 보입니다. 또한 UIWebView이 완전히로드 된 후에이 코드를 실행하고 있는지 확인하십시오.

+0

고맙습니다! 지금 일하고있어! – user1195202

+0

크기는 너비 : 0 높이 : 일부 컨트롤의 경우 0입니다. 다시 한 번 감사드립니다! – user1195202

관련 문제