【问题标题】:Can't change background for UIWebView in iOS无法在 iOS 中更改 UIWebView 的背景
【发布时间】:2025-12-15 14:45:02
【问题描述】:

有没有办法改变UIWebView的背景颜色?

IB 中没有设置任何颜色效果UIWebView 行为:在加载实际内容之前,它显示为白色(在加载和渲染内容之间导致白色闪烁)。

以编程方式设置背景颜色也不做任何事情。

代码如下:

@interface Web_ViewViewController : UIViewController {

    UIWebView *web;
}

@property (nonatomic, retain) IBOutlet UIWebView *web;
@end

....
-(void)viewDidLoad {
    super viewDidLoad;

    web.backgroundColor = [UIColor blueColor];
    NSURL *clUrl = [NSURL URLWithString:@"http://www.apple.com"];
    NSURLRequest *req = [NSURLRequest requestWithURL:clUrl];

    [web loadRequest:req];
}

【问题讨论】:

    标签: ios uiwebview background-color


    【解决方案1】:

    是的,设置 backgroundColor 属性似乎对 UIWebView 没有影响。

    我没有令人满意的解决方案,只有您可以考虑的解决方法。

    • 首先改变背景颜色,通过设置一个初始的空 HTML 页面
    • 加载后,您将加载主 URL(例如 http://www.apple.com

    如果您不等待初始 HTML 页面加载,则在加载主 URL 时您可能看不到初始背景。所以你需要使用 UIWebViewDelegate 的 webViewDidFinishLoad: 方法。您可以在 Web_ViewViewController 类中实现该方法,并使您的 Web_ViewViewController 符合 UIWebViewDelegate 协议。最初,在加载完空的 HTML 页面之前,仍然会出现短暂的白色背景闪烁。不知道如何摆脱它。下面是一个示例:

    - (void)viewDidLoad
    {
        [web loadHTMLString: @"<html><body bgcolor=\"#0000FF\"></body></html>" baseURL: nil];
        web.delegate = self;
    }
    
    - (void)webViewDidFinishLoad:(UIWebView *)webView
    {
        static BOOL loadedMainURLAlready = NO;
        if (!loadedMainURLAlready)
        {
            NSURL *clUrl = [NSURL URLWithString:@"http://apple.com"];
            NSURLRequest *req = [NSURLRequest requestWithURL:clUrl];
            [webView loadRequest:req];
            loadedMainURLAlready = YES;
        }
    }
    

    【讨论】:

    • 是的,我已经在做类似的事情了,我讨厌这种白色闪烁,不管它有多快!我确实找到了一些使视图透明的解决方案,我会玩弄它。但我不确定为什么 UIWevView 不能采用背景色!谢谢你的回答!
    【解决方案2】:

    试试这个。加载完成后,它将淡入 UIWebView,您将看不到 flash。

    @interface Web_ViewViewController : UIViewController <UIWebViewDelegate> {
    
    UIWebView *web;
    BOOL firstLoad;
    }
    
    @property (nonatomic, retain) IBOutlet UIWebView *web;
    @end
    
    ...
    
    (void)viewDidLoad {
        [super viewDidLoad];
        firstLoad = YES;
        web.delegate = self;
        web.alpha = 0.0;
        NSURL *clUrl = [NSURL URLWithString:@"http://www.apple.com"];
        NSURLRequest *req = [NSURLRequest requestWithURL:clUrl];
        [web loadRequest:req];
    }
    
    - (void)webViewDidFinishLoad:(UIWebView *)webView {
    if (firstLoad) {
        firstLoad = NO;
        [UIView beginAnimations:@"web" context:nil];
        web.alpha = 1.0;
        [UIView commitAnimations];
        }
    }
    

    webViewDidFinishLoad 中的动画块将在加载后淡入视图,或者如果您希望让它弹出,则只需删除 UIView 调用。

    【讨论】:

      【解决方案3】:

      您可以将 webview 的 opaque 属性设置为 NO,然后设置下方视图的背景颜色。

      [webView setOpaque:NO];
      

      【讨论】:

      • webView.bakgroundColor = [UIColor clearColor]一起
      • 这确实需要更多的选票。它比 Adolfo 的答案简单得多,而且效果很好(根据@stigi 的建议,没有它你会得到灰色闪光而不是白色,这已经是一种改进)。
      • 这不起作用。唯一简单的解决方案似乎是将 web 视图默认设置为隐藏,然后在 webViewDidFinishLoad 中取消隐藏。
      • 这确实有一些效果,但是如果你滚动到底部并超出,webview 的渐变仍然存在
      • 完美运行。将 webView 设置为 opaque 可以让您看到 webView 的背景颜色。像@stigi 建议的那样将其设置为清除将让您看到 webView 背后的任何内容。
      【解决方案4】:

      试试这个。我使用了我的应用程序资源中的背景图像“address.png”。

      NSString *path=[[NSBundle mainBundle] pathForResource:@"address" ofType:@"png"];
      
      NSURL *a=[[NSURL alloc] initFileURLWithPath:[path stringByDeletingLastPathComponent] isDirectory:YES];
      
      
      NSLog(@"%@",[a description]);
      
      NSDictionary *d=[parsedarray objectAtIndex:0];
      // generate dynamic html as you want.
      NSMutableString *str=[[NSMutableString alloc] init];
      [str appendString:@"<html><body background=\"address.png\"><table><tr>"];
      [str appendFormat:@"<td valign=\"top\" align=\"left\"><font size=\"2\"><b>Market Address</b><br>%@,<br>%@,<br>%@</font></td>",
                   ([d valueForKey:@"address1"])?[d valueForKey:@"address1"]:@"",
                   ([d valueForKey:@"address2"])?[d valueForKey:@"address2"]:@"",
                   ([d valueForKey:@"address3"])?[d valueForKey:@"address3"]:@""
                   ];
      
      [str appendFormat:@"<td valign=\"top\" align=\"left\"><font size=\"2\"><b>Contact Number</b><br>%@<br><b><a href=\"%@\">Email Us</a><br><a href=\"%@\">Visit Website</a></b></font></td>",
      [d valueForKey:@"phone"],[d valueForKey:@"email"],[d valueForKey:@"website"]];
      [str appendString:@"</tr></table></body></html>"];
      
      
      // set base url to your bundle path, so that it can get image named address.png 
      [wvAddress loadHTMLString:str baseURL:a];
      
      [str release]; str=nil;
      [a release];
      

      【讨论】:

        【解决方案5】:

        这里没有一个答案对我有用,它们都涉及到某种闪光。我在这里找到了一个可行的答案:http://www.iphonedevsdk.com/forum/iphone-sdk-development/4918-uiwebview-render-speeds-white-background.html(我不得不将延迟调整为 0.25 以避免闪烁)。记得在 InterfaceBuilder 中检查 UIWebView 的“隐藏”标志。

        - (void)webViewDidFinishLoad:(UIWebView *)webView 
        {
            [self performSelector:@selector(showAboutWebView) withObject:nil afterDelay:.25];          
        }
        
        - (void)showAboutWebView 
        {
            self.infoWebView.hidden = NO;
        }
        

        【讨论】:

          【解决方案6】:

          我找到了解决方案。 加载后添加 Web 视图。

          -(void)webViewDidFinishLoad: (UIWebView *)pageView {
          
              self.view =pageView;
              [pageView release];
          }
          

          【讨论】:

            【解决方案7】:

            在 Xcode 4.6.3 中

            - (void)viewDidLoad
            {
                [super viewDidLoad];
            
                self.viewWeb.hidden = YES;
                self.viewWeb.delegate = self;
            // this allows the UIWebView box to your background color seamlessly.
                self.viewWeb.opaque = NO;
            
            }
            

            【讨论】:

              【解决方案8】:

              这可能会有所帮助

              (Xcode 5 iOS 7) 适用于 iOS 7 和 Xcode 5 的通用应用程序示例。它是一个开源项目/示例,位于:Link to SimpleWebView (Project Zip and Source Code Example)

              webview.backgroundColor = [UIColor clearColor];

              【讨论】: