我知道这很常见,但我只是想知道为什么这个非常简单的代码不起作用。
我在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
为什么会发生这种情况,我该如何预防?
答案 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包装器,所以大多数绘图都是线程安全的。
希望这有帮助。