【问题标题】:Preloading a UIWebView, avoiding white screen flash预加载一个UIWebView,避免白屏闪烁
【发布时间】:2011-05-13 03:55:32
【问题描述】:

我正在开发一个具有表格导航功能的应用程序,以最终深入到显示各种信息的UIWebView。然而,从UITableView 的流畅到UIWebView 的缓慢摇摆的转变对用户来说是不和谐的,所以我想尽我所能改善这种体验。

具体来说,tableViewsUIWebView 页面的背景都是黑色背景,但是当我打开 UIWebView 时,它会闪烁空白大约一秒钟(本地和远程 HTML 文件都是这种情况.) 我如何(理想情况下)预加载此过程,或者(至少)使“闪光灯”全黑而不是全白?我尝试将视图 / webView 的背景设置为黑色,但这似乎没有帮助。

现在在我的应用程序中,当用户选择一个单元格时,应用程序只会加载 UIWebView 子类并将其推送到导航堆栈上。 UIWebView 子类有一个活动指示器,可以在 WebViewDidStartLoad 和 WebViewDidFinishLoad 上开始和停止动画,它工作正常,但它对帮助“白色闪光”没有任何帮助。

【问题讨论】:

  • 您说 UIWebView 有黑色背景:是在 HTML/CSS 中设置的还是在视图本身上实际设置的?如果是前者,那么试试 [myWebView setBackgroundColor: [UIColor blackColor]];

标签: iphone uiwebview


【解决方案1】:

我已经测试过了...我正在发送我使用过的两种方法...

 - (void)viewDidLoad {
        [super viewDidLoad]; //objWebView is the outlet of UIWebView
        [objWebView loadHTMLString:@"<html><body style=\"background-color:black;\"></body></html>" baseURL:nil];

        //the more the delay the errors will be less so within 0.1-0.3 would be fine
        [self performSelector:@selector(loadURL:) withObject:nil afterDelay:0.1]; 
    }

-(void)loadURL:(id)sender{
    [objWebView stopLoading]; //added this line to stop the previous request
    NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];
    [objWebView loadRequest:req];
}

这里我在 0.1 秒后执行请求,否则它会像你的情况一样看起来是白色的。或者你可以根据时间给你的延迟时间。干杯:)

【讨论】:

  • 好消息——这成功了!在那它摆脱了白色。坏消息,它现在给出一个 NSError,任何想法为什么? Error: Error Domain=NSURLErrorDomain Code=-999 "The operation couldn’t be completed. (NSURLErrorDomain error -999.)" UserInfo=0x4baee10 {NSErrorFailingURLKey=about:blank, NSErrorFailingURLStringKey=about:blank} 尽管出现错误,但它实际上工作正常,因为它实际上仍在加载网站,并且不会闪烁白色。
  • URL 加载系统错误代码 NSURLErrorCancelled = -999 NSURLErrorCancelled 当异步加载被取消时返回。 Web Kit 框架委托在对加载资源执行取消操作时将收到此错误。请注意,如果取消下载,NSURLConnection 或 NSURLDownload 委托将不会收到此错误。
  • 我会进一步研究,这可能与我自己的代码无关。我给了你回答这个问题的功劳。谢谢!
  • 实际上 NSURLErrorDomain 只是因为之前的请求被取消而出现。我认为这将是第一个..更新答案..它会起作用..然后接受答案.. :)
  • 我所做的是:if ([error code] != -999) { //show alert, etc. } 所以它不会在这种情况下提醒用户。
【解决方案2】:

试试你的

    -(void)viewDidLoad{
       myWebView.hidden = YES;

然后在

    -(void)loadURL:(id)sender{  
        myWebView.hidden = NO;

【讨论】:

    【解决方案3】:

    我用过:

    [webView setHidden:YES];  
    [webView setDelegate:self];
    

    在创建我的 webView 并发出请求然后添加此委托方法来处理已完成的请求时:

    - (void) webViewDidFinishLoad:(UIWebView*)webView{  
        [webView setHidden:NO];  
    }
    

    【讨论】:

    • 也许在自己的方法中设置 setHidden:No 并在延迟后使用 performSelector 调用它。 webViewDidFinishLoad 在我的 iPad 3 上还很早
    • 我真的认为这应该是公认的答案,干净且易于理解。也许使用属性表示法会更好:webView.hidden = NOwebView.delegate = self
    • 这个不行,我用了同样的方法,还是出现黑屏页面。
    【解决方案4】:

    成功了。 您必须首先在 Interface Builder 中创建一个视图。 然后使用包含 webview 的 ViewController 的 init 中的 initWithFrame 将 html 加载到 webview(这就是魔法发生的地方):

    CGRect webFrame = [[UIScreen mainScreen] applicationFrame];
    webView = [[UIWebView alloc] initWithFrame:webFrame];
    

    然后只需将 webView 加载到 viewWillAppear 中的视图中:

    [viewWeb addSubview:webView];
    

    这真的是界面设计的问题,是直接在视图上绘制还是在子视图中绘制然后在视图中绘制那个子视图更快?

    【讨论】:

      【解决方案5】:

      几年前我已经解决了这个问题,使用将 UIWebView 隐藏在 UIImageView 后面的常用方法,然后在延迟后移除 UIImageView。

      但它突然又回来了,我想是在 iOS 7.0.4 上。它发生在全新的 iPad Air 和较旧的非视网膜 iPad mini 上。经过两天的拉扯,我终于找到了解决方法。

      假设您的 webview 仅限于横向,初始化如下:

      WebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 1024.0f, 768.0f)];
      

      然后在预加载后使其可见,例如在 webview 上使用bringSubviewToFront 或 setHidden:NO(或者在 UIImageView 上使用 setHidden:YES 或 removeFromSuperview)。但不是无缝切换视图,而是闪烁,背景颜色闪烁大约半秒。

      解决方法是稍微改变 webview 的大小:

      WebView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 1024.01f, 768.0f)];
      

      问题和修复是高度可重现的。它适用于小至小数点后第四位 (1024.0001f) 的微小变化。在小数点后第五位 (1024.00001f),闪存返回。高度值 (768.0f) 似乎无关紧要。

      【讨论】:

        【解决方案6】:

        或者,您可以将 webview 的背景颜色设置为您正在使用的任何背景颜色,而不是解决该问题。当然,除非您使用的是图像。

        【讨论】:

        • 在加载网络 URL 之前尝试加载一个只有透明正文的 HTML 字符串。我记得以前以某种方式解决过这个问题,也许就是这样。
        • 网页视图或父视图的背景不影响黑屏。
        猜你喜欢
        • 2013-05-02
        • 2020-06-22
        • 1970-01-01
        • 1970-01-01
        • 2012-01-02
        • 1970-01-01
        • 2012-07-07
        • 1970-01-01
        • 2023-04-02
        相关资源
        最近更新 更多