2009-10-10 34 views
58

Có cách nào để thay đổi màu nền cho UIWebView không?Không thể thay đổi nền cho UIWebView trong iPhone SDK

Không có màu nào được đặt ở hiệu ứng IB UIWebView hành vi: trước khi nội dung thực được tải, nó hiển thị màu trắng (gây ra đèn flash trắng giữa thời điểm tải và nội dung được hiển thị).

Đặt màu nền theo lập trình cũng không làm bất cứ điều gì.

Đây là mã:

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

Trả lời

1

Vâng, có vẻ như thiết lập thuộc tính backgroundColor không có tác dụng trên UIWebView.

Tôi không có giải pháp thỏa đáng, chỉ giải pháp thay thế mà bạn có thể xem xét.

  • sự thay đổi đầu tiên màu nền, bằng cách thiết lập một trang HTML trống ban đầu
  • Một khi điều đó đã được nạp, bạn nạp URL chính của bạn (ví dụ http://www.apple.com)

Nếu bạn không chờ đợi trang HTML ban đầu để tải, bạn có thể không thấy nền ban đầu trong khi URL chính đang tải. Vì vậy, bạn sẽ cần sử dụng phương thức webViewDidFinishLoad: của UIWebViewDelegate. Bạn có thể thực hiện phương thức đó trong lớp Web_ViewViewController của bạn và làm cho Web_ViewViewController của bạn tuân theo giao thức UIWebViewDelegate. Ban đầu, vẫn có một nhấp nháy tạm thời của nền trắng cho đến khi trang HTML của trang thứ cấp tải. Không chắc chắn làm thế nào để thoát khỏi điều đó. Dưới đây là một mẫu:

- (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

vâng, tôi đang làm điều gì đó tương tự như vậy và tôi ghét nhấp nháy trắng này, cho dù nó nhanh đến mức nào! Tôi đã tìm thấy một số giải pháp làm cho chế độ xem trong suốt, tôi sẽ chơi với nó. Nhưng tôi không chắc chắn tại sao UIWevView không thể lấy màu nền! Cảm ơn bạn đã trả lời! – leon

17

Hãy dùng thử. Nó sẽ mờ dần UIWebView trong khi nó đã tải xong và bạn sẽ không thấy đèn 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]; 
    } 
} 

Khối hình động trong webViewDidFinishLoad sẽ làm mờ chế độ xem trong khi tải hoặc nếu bạn muốn bật lên, sau đó chỉ cần xóa cuộc gọi UIView.

180

Bạn có thể đặt thuộc tính mờ của chế độ xem web thành NO và sau đó đặt màu nền của chế độ xem bên dưới.

[webView setOpaque:NO];

+37

cùng với 'webView.bakgroundColor = [UIColor clearColor]' – stigi

+6

Điều này thực sự cần nhiều phiếu bầu hơn. Nó đơn giản hơn nhiều so với câu trả lời của Adolfo và hoạt động hoàn hảo (với gợi ý của @ stigi, mà không có nó, bạn nhận được một đèn flash màu xám thay vì màu trắng đã được cải thiện). –

+0

Điều này không hiệu quả. Giải pháp đơn giản duy nhất dường như đã thiết lập chế độ xem web để ẩn theo mặc định, sau đó bỏ ẩn nó trong webViewDidFinishLoad. – Jonny

0

Hãy thử điều này. Tôi đã sử dụng hình nền "address.png" từ tài nguyên ứng dụng của mình.

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

Không có câu trả lời nào ở đây phù hợp với tôi, tất cả chúng đều liên quan đến một số loại flash. Tôi tìm thấy một câu trả lời làm việc ở đây: http://www.iphonedevsdk.com/forum/iphone-sdk-development/4918-uiwebview-render-speeds-white-background.html (Tôi đã phải điều chỉnh độ trễ để 0,25 để tránh nhấp nháy). Hãy nhớ kiểm tra cờ "ẩn" của UIWebView trong InterfaceBuilder.

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

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

Tôi nhận được giải pháp. Thêm chế độ xem web sau khi được tải.

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

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

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

} 
Các vấn đề liên quan