【问题标题】:Why does this UIWebView to UIImage code render a blank image?为什么这个 UIWebView 到 UIImage 代码会呈现一个空白图像?
【发布时间】:2014-09-04 23:25:53
【问题描述】:

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

我在 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

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

【问题讨论】:

  • 在将请求加载到 Web 视图之前尝试将 Web 视图添加到 self.view
  • 它不起作用@rmaddy。
  • 你到底想用 webview/image 做什么?
  • 我正在使用完全相同的代码并且它在我的端工作正常..
  • @Mike 我只是想看看 UIImage 是否有 WebView 的内容。以下是我发布的代码得到的结果:dropbox.com/s/r7ror8yjg843ufa/…

标签: ios objective-c uiwebview uiimage


【解决方案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中找到了这个:

Core Graphics 和 Core Animation 是低级 API,通常是线程安全的。但是,关于访问的相同规则仍然适用:任何工作不得同时被多个线程访问,否则绘图将失败并且您的应用程序将崩溃。我会对 UIImage 保持警惕(但不害怕),因为 UIKit 对象不仅不是线程安全的,它们基本上是在后台线程中滴答作响的定时炸弹,并且会很高兴地无缘无故地从悬崖上直接跳入 Exception Land。但是,因为 UIImage 只是一个 CGImage 包装器,所以大多数绘图都是线程安全的。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2020-02-07
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多