如何正确转换UIWebView与更改内容到UI图像

时间:2012-11-14 08:14:28

标签: iphone uiwebview uiimage nsthread

我想要做的是每次更改/加载webview的内容时将UIWebView转换为UIImage。

以下是代码:

- (void)viewDidLoad {
    [self.tmpWebView loadHTMLString:[NSString stringWithFormat:@"Some %i HTML", 0,baseURL:nil];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {

    if (webView==tmpWebView && pngCount<[self.arrayOfHtmlContent count]) {
        UIGraphicsBeginImageContext(webView.frame.size);
        {
            [webView.layer renderInContext: UIGraphicsGetCurrentContext()];
            UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
            UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
            imageView.frame = CGRectMake(10, 10+((pngCount==1)?0:(pngCount-1)*100), 400, 200);
            [imageView setBackgroundColor:[UIColor redColor]];
            [_someScrollView addSubview:imageView];
            //NSString  *pngPath = [NSHomeDirectory() stringByAppendingPathComponent:[NSString stringWithFormat: @"Documents/Test-%i.png",pngCount]];
            //[UIImagePNGRepresentation(image) writeToFile:pngPath atomically:YES];
        }
        UIGraphicsEndImageContext();

        [self performSelector:@selector(loadWebViewWith:) withObject:[[NSArray alloc] initWithObjects:webView, [[NSNumber alloc] initWithInt:pngCount], nil ] afterDelay:0.3];//DELAY INCREASING DOES NOT CHANGE ANYTHING

        pngCount++;
        //NSLog(@"Finish%i: %@",(pngCount-1),[webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"]);
    }
}

- (void) loadWebViewWith:(NSArray*)array {
    [(UIWebView*)[array objectAtIndex:0] loadHTMLString:[NSString stringWithFormat:@"Another %i HTML", [[array objectAtIndex:1] intValue]] baseURL:nil];
}

我不知道为什么但是一些创建的UIImages是重复的。这可能是因为Thread没有完成转换为UIImage,但延迟开始加载webview的新内容(即使我将其设置为5secs)也没有改变任何东西。

有人可以解释我为什么会出现重复的UIImages吗?

2 个答案:

答案 0 :(得分:1)

我让它工作......必须将WebView添加到ViewController.view中。显然原因是主线程的优先级...

所以,这是代码:

- (void)viewDidLoad {

    pngCount = 0;

    [self.tmpWebView loadHTMLString:[NSString stringWithFormat:@"Some %i HTML", pngCount] baseURL:nil];

    [self.view insertSubview:self.tmpWebView atIndex:0];/////////
}

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    if (webView==self.tmpWebView && pngCount<[self.arrayOfHtmlContent count]) {

        [self performSelector:@selector(webViewToImage) withObject:nil afterDelay:0.05];

        [self performSelector:@selector(loadWebViewContent) withObject:nil afterDelay:0.1];
    }
}


- (void) webViewToImage {

    UIGraphicsBeginImageContext(self.tmpWebView.frame.size);
    {
        [self.tmpWebView.layer renderInContext: UIGraphicsGetCurrentContext()];
        UIImage* image = UIGraphicsGetImageFromCurrentImageContext();

        UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
        imageView.frame = CGRectMake(10, 110+((pngCount==1)?0:(pngCount-1)*100), 200, 90);
        [imageView setBackgroundColor:[UIColor clearColor]];

        UIControl *mask = [[UIControl alloc] initWithFrame:imageView.frame];

        imageView.frame = CGRectMake(0, 0, imageView.frame.size.width, imageView.frame.size.height);
        [mask addSubview:imageView];

        [mask addTarget:self action:@selector(showOnMainWebView:) forControlEvents:UIControlEventTouchUpInside];
        mask.tag = pngCount;

        [_someScrollView addSubview:mask];
    }
    UIGraphicsEndImageContext();

    pngCount++;
}

- (void) loadWebViewContent {

    if (pngCount < [self.arrayOfHtmlContent count]) {
        [self.tmpWebView loadHTMLString:[NSString stringWithFormat:@"Another %i HTML", pngCount] baseURL:nil];
    }
}

答案 1 :(得分:0)

webViewDidFinishLoad:完成加载帧后调用

WebView。因此,您获得重复的页面可能包含多个框架。