【问题标题】:How Do I Properly Convert UIWebView with Chaning Content to UIImages如何正确转换 UIWebView 并将内容更改为 UIImages
【发布时间】:2012-11-14 08:14:28
【问题描述】:

我要做的是每次更改/加载 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];
}

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

谁能解释我为什么会得到重复的 UIImages?

【问题讨论】:

    标签: iphone uiwebview uiimage nsthread


    【解决方案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];
        }
    }
    

    【讨论】:

      【解决方案2】:

      webViewDidFinishLoad:WebView 完成加载帧后调用。因此,您获得重复的那些页面可能包含多个框架。

      【讨论】:

      • 感谢您的回复。为什么他们有多个框架,为了测试我将webview的内容设置为相同的简单html?
      • 在那种情况下,我不知道你的问题的原因。
      猜你喜欢
      • 2010-10-25
      • 2017-07-27
      • 1970-01-01
      • 2012-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      相关资源
      最近更新 更多