2009-10-10 4 views
58

Gibt es eine Möglichkeit, Hintergrundfarbe für UIWebView zu ändern?Kann Hintergrund für UIWebView in iPhone SDK nicht ändern

Keine der im IB-Effekt eingestellten Farben UIWebView Verhalten: Bevor der tatsächliche Inhalt geladen wird, wird er weiß angezeigt (es entsteht ein weißer Blitz zwischen dem Zeitpunkt des Ladens und dem Rendern des Inhalts).

Einstellung Hintergrundfarbe programmatisch tut auch nichts.

Hier Code:

@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]; 
} 

Antwort

1

Ja, so scheint es, die Backgroundcolor-Eigenschaft hat keine Auswirkungen auf die UIWebView.

Ich habe keine zufriedenstellende Lösung, nur eine Problemumgehung, die Sie berücksichtigen können.

  • Erste Änderung der Hintergrundfarbe, indem ein Anfangs leere HTML-Seite Einstellung
  • Sobald das geladen ist, können Sie Ihre Haupt-URL geladen werden (zB http://www.apple.com)

Wenn Sie das nicht warten initiale HTML-Seite, die geladen werden soll, wird der ursprüngliche Hintergrund möglicherweise nicht angezeigt, während die Haupt-URL geladen wird. Sie müssen also die webViewDidFinishLoad-Methode von UIWebViewDelegate verwenden. Sie können diese Methode in Ihrer WebViewViewController-Klasse implementieren und Ihren WebViewViewController dem UIWebViewDelegate-Protokoll anpassen. Anfangs gibt es immer noch ein flüchtiges weißes Hintergrundflackern, bis die leere HTML-Seite geladen ist. Nicht sicher, wie man das los wird. Unten ist ein Beispiel:

- (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; 
    } 
} 
+1

Ja, ich mache schon etwas ähnliches und ich hasse dieses weiße Flackern, egal wie schnell es ist! Ich habe einige Lösungen gefunden, um die Sicht transparent zu machen, ich werde damit herumspielen. Aber ich bin nicht sicher, warum UIWevView Hintergrundfarbe nicht nehmen kann! Danke, für die Beantwortung! – leon

17

Probieren Sie es aus. Nach dem Ladevorgang wird das UIWebView ausgeblendet und der Flash wird nicht mehr angezeigt.

@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]; 
    } 
} 

Der Block Animation in webViewDidFinishLoad wird die Ansicht in verblassen, sobald es geladen wird, oder wenn Sie es vorziehen, sie auf dann Pop haben nur die UIView Anrufe entfernen.

180

Sie können die undurchsichtige Eigenschaft der Webansicht auf NEIN setzen und dann die Hintergrundfarbe der darunter liegenden Ansicht festlegen.

[webView setOpaque:NO];

+37

zusammen mit 'webView.bakgroundColor = [UIColor clearColor]' – stigi

+6

Dies erfordert wirklich mehr Stimmen. Es ist so viel einfacher als Adolfos Antwort und funktioniert perfekt (mit @ stigis Vorschlag, ohne sie erhält man einen grauen Blitz statt Weiß, was schon eine Verbesserung ist). –

+0

Dies hat nicht funktioniert. Die einzige einfache Lösung schien darin zu bestehen, die Webansicht standardmäßig zu verbergen und sie dann in webViewDidFinishLoad einzublenden. – Jonny

0

Probieren Sie dies aus. Ich habe ein Hintergrundbild "address.png" aus meinen Anwendungsressourcen verwendet.

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

Keine der Antworten hier funktionierte für mich, sie alle beteiligten sich immer noch eine Art von Flash. Ich fand eine funktionierende Antwort hier: http://www.iphonedevsdk.com/forum/iphone-sdk-development/4918-uiwebview-render-speeds-white-background.html (Ich musste die Verzögerung auf .25 einstellen, um das Blinken zu vermeiden). Denken Sie daran, das "versteckte" Flag von UIWebView in InterfaceBuilder zu überprüfen.

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

- (void)showAboutWebView 
{ 
    self.infoWebView.hidden = NO; 
} 
1

Ich habe eine Lösung. Fügen Sie die Webansicht hinzu, nachdem sie geladen wurde.

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

    self.view =pageView; 
    [pageView release]; 
} 
0

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

}