无法在 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 的 UIWebView 中更改数字和电子邮件的颜色?