为什么这个UIWebView到UIImage代码呈现一个空白图像?

时间:2014-09-04 23:25:53

标签: ios objective-c uiwebview uiimage

我知道这很常见,但我只是想知道为什么这个非常简单的代码不起作用。

我在webViewDidFinishLoad方法中的NSLog行中有一个断点,我正在检查生成的UIImage(使用快速查看)。结果是一个空白图像,其中应该是UIWebView(以及我为了调试目的放置的黑色背景)。

#import "KIViewController.h"

@interface KIViewController ()

@end

@implementation KIViewController

-(void)webViewDidStartLoad:(UIWebView *)webView {
    NSLog(@"start");
}

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

    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.opaque, 0.0);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    NSLog(@"webview did finish load");

}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIWebView *wv = [[UIWebView alloc] initWithFrame:CGRectMake(0,0,640,200)];
    wv.delegate = self;

    NSString *url=@"http://www.google.com";
    NSURL *nsurl=[NSURL URLWithString:url];
    NSURLRequest *nsrequest=[NSURLRequest requestWithURL:nsurl];
    [wv loadRequest:nsrequest];
    self.view.backgroundColor = [UIColor blackColor];
    [self.view addSubview:wv];

}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

为什么会发生这种情况,我该如何预防?

1 个答案:

答案 0 :(得分:1)

我曾经有过这个问题一次。调用委托函数webViewDidFinishLoad:和将webView内容绘制到屏幕之间有一点延迟。内容存在并存储在webView中。只是它没有在屏幕上呈现。我不知道为什么会发生这种情况,但我想这是因为webView的渲染过程需要比平均UIKit对象更长的时间(由于矢量图形)。

就我而言,我需要根据加载的内容调整webView框架的大小。所以,我在主线程上完成了所有帧调整,并从后台线程调用了屏幕截图功能。类似的东西:

dispatch_async(dispatch_get_main_queue(), ^{
    /*
     do some adjustments here
    */

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
        [view.layer renderInContext:UIGraphicsGetCurrentContext()];
        UIImage * screenshot = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    });
});

就线程安全而言,我在另一个answer中找到了这个:

核心图形和核心动画是低级API,通常是线程安全的。但是,关于访问的相同规则仍然适用:任何工作都不能同时被多个线程访问,否则绘图将失败,您的应用程序将崩溃。我会对UIImage保持警惕(但并不害怕),因为UIKit对象不是线程安全的,它们基本上是在背景线程中滴定时间炸弹,并且很乐意直接从悬崖上跳入Exception Land for没有充分的理由。但是,因为UIImage只是一个CGImage包装器,所以大多数绘图都是线程安全的。

希望这有帮助。