Невозможно изменить фон для UIWebView в iOS

Есть ли способ изменить цвет фона для 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];
}

person leon    schedule 10.10.2009    source источник


Ответы (8)


Вы можете установить для свойства opaque веб-просмотра значение NO, а затем установить цвет фона представления ниже.

[webView setOpaque:NO];
person Kaveh    schedule 12.03.2010
comment
вместе с webView.bakgroundColor = [UIColor clearColor] - person stigi; 14.07.2010
comment
Это действительно нужно больше голосов. Это намного проще, чем ответ Адольфо, и работает отлично (с предложением @stigi, без него вы получаете серую вспышку, а не белую, что уже является улучшением). - person Rob Van Dam; 04.12.2010
comment
Это не сработало. Единственное простое решение, казалось, заключалось в том, чтобы скрыть веб-представление по умолчанию, а затем отобразить его в webViewDidFinishLoad. - person Jonny; 06.12.2010
comment
это действительно имеет НЕКОТОРЫЙ эффект, но градиент веб-просмотра, если вы прокручиваете вниз и дальше, все еще остается - person Tomen; 20.05.2011
comment
Работает отлично. Установка для webView непрозрачности позволяет видеть цвет фона webView. Установка его на очистку, как предложено @stigi, позволит вам увидеть все, что находится за webView. - person noodl_es; 25.05.2011
comment
Я хотел бы отметить для тех, у кого есть проблемы с этим, что установка свойства opaque веб-просмотра в NO и его backgroundColor для очистки отлично работает, если это делается в коде, но не работает, если вы пытаетесь сделать это, используя только InterfaceBuilder. - person jj0b; 20.07.2011
comment
for(UIView *wview in [[[self.webView subviews] objectAtIndex:0]subviews]) { if([wview isKindOfClass:[UIImageView class]]) { wview.hidden = YES; } } [self.webView setOpaque:NO]; [self.webView setBackgroundColor: [UIColor whiteColor]]; - person mkto; 12.10.2011

Попробуйте это. После завершения загрузки UIWebView исчезнет, ​​и вы не увидите вспышку.

@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.

person Adolfo    schedule 12.10.2009

Ни один из ответов здесь не сработал для меня, все они включали какую-то вспышку. Я нашел здесь рабочий ответ: http://www.iphonedevsdk.com/forum/iphone-sdk-development/4918-uiwebview-render-speeds-white-background.html (мне пришлось настроить задержку на 0,25, чтобы избежать мигания) . Не забудьте проверить «скрытый» флаг UIWebView в InterfaceBuilder.

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

- (void)showAboutWebView 
{
    self.infoWebView.hidden = NO;
}
person Bogatyr    schedule 10.05.2010

Да, кажется, что установка свойства backgroundColor не влияет на UIWebView.

У меня нет удовлетворительного решения, только обходной путь, который вы можете рассмотреть.

  • Сначала измените цвет фона, установив исходную пустую HTML-страницу.
  • После загрузки вы загружаете свой основной URL-адрес (например, http://www.apple.com)

Если вы не дождетесь загрузки исходной HTML-страницы, вы можете не увидеть исходный фон во время загрузки основного URL-адреса. Поэтому вам нужно будет использовать метод webViewDidFinishLoad: UIWebViewDelegate. Вы можете реализовать этот метод в своем классе 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;
    }
}
person pythonquick    schedule 10.10.2009
comment
да, я уже делаю что-то подобное, и я ненавижу это белое мерцание, каким бы быстрым оно ни было! Я нашел несколько решений сделать представление прозрачным, я поиграю с ним. Но я не уверен, почему UIWevView не может использовать цвет фона! Спасибо, что ответили! - person leon; 10.10.2009

У меня есть решение. Добавьте веб-представление после его загрузки.

-(void)webViewDidFinishLoad: (UIWebView *)pageView {

    self.view =pageView;
    [pageView release];
}
person user377808    schedule 16.01.2011

Попробуйте это. Я использовал фоновое изображение «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];
person Sagar R. Kothari    schedule 14.04.2010

В 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;

}
person Drew Harris    schedule 27.08.2013

Это может помочь

(Xcode 5 iOS 7) Пример универсального приложения для iOS 7 и Xcode 5. Это проект/пример с открытым исходным кодом, расположенный здесь: Ссылка на SimpleWebView (пример ZIP-файла и исходного кода проекта)

webview.backgroundColor = [UIColor clearColor];

person Matthew Ferguson    schedule 21.01.2014