无法在 iOS 中更改 UIWebView 的背景

Posted

技术标签:

【中文标题】无法在 iOS 中更改 UIWebView 的背景【英文标题】:Can't change background for UIWebView in iOS 【发布时间】:2010-12-05 13:10:28 【问题描述】:

有没有办法改变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];

【问题讨论】:

【参考方案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];

【讨论】:

以上是关于无法在 iOS 中更改 UIWebView 的背景的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 的 web 视图中更改按钮的背景颜色

如何更改 UIWebView 中的字符编码?

UIWebView ios8中的透明背景

如何在 iOS 的 UIWebView 中更改数字和电子邮件的颜色?

iOS 背景视频循环 GIF UIWebview 或 VideoPlayer

iOS:在 didFinishLoad 之后调整 UIWebView 的大小(内容应该适合而不滚动)