1. 程式人生 > >UIWebview圖片過大,縮放至螢幕寬度

UIWebview圖片過大,縮放至螢幕寬度

webview在手機上顯示的內容經常非常寬,顯示出來之後要手動縮放才能正常瀏覽。但如果用 
C程式碼  收藏程式碼
  1. [self.webView setScalesPageToFit:YES];  

則會被居中縮放的非常小,如圖:



(請無視我demo裡的title。。。) 


  其實html本身有一個縮放的方法,可以在<head>里加一個節點: 

Html程式碼  收藏程式碼
  1. <meta name="viewport" content="initial-scale=1.0, minimum-scale=0.1, maximum-scale=2.0, user-scalable=yes\">
      


content裡規定了這個介面: 
最小縮放比例是0.1:minimum-scale=0.1 
最大縮放比例是2.0:maximum-scale=2.0 
允許使用者縮放:user-scalable=yes 
當前縮放比是1.0:initial-scale=1.0


因此我們可以通過計算initial-scale來決定頁面顯示的時候縮放到什麼比例是正好充滿螢幕寬。 

可以通過js獲取body的實際寬度: 
Js程式碼  收藏程式碼
  1. document.body.scrollWidth  


然後根據我們自己webview的寬度,就可以得到期待的initial-scale了:webViewwebView.frame.size.width/pageWidth; 


下邊來說具體怎麼在iOS專案中實現: 

第一步:js必須是在html載入完成後才能呼叫,因此在iOS專案中,需要先載入一次原始的html:

C程式碼  收藏程式碼
  1. //html是否載入完成  
  2. isLoadingFinished = NO;  
  3. //這裡一定要設定為NO  
  4. [self.webView setScalesPageToFit:NO];  
  5. [self.webView loadHTMLString:currentMail.htmlBody baseURL:nil];  
  6. //第一次載入先隱藏webview  
  7. [self.webView setHidden:YES];  
  8. self.webView.delegate = self;  


第二步:第一次載入偷偷載入完成後,在代理裡邊呼叫js獲取寬度,然後算出合適的縮放比例,並在<head>里加上我們需要的<meta>,然後再將新的html重新載入,載入完成後再顯示:
Java程式碼  收藏程式碼
  1. #pragma mark - UIWebViewDelegate  
  2. - (void)webViewDidFinishLoad:(UIWebView *)webView  
  3. {  
  4.     //若已經載入完成,則顯示webView並return  
  5.     if(isLoadingFinished)  
  6.     {  
  7.         [self.webView setHidden:NO];  
  8.         return;  
  9.     }  
  10.     //js獲取body寬度  
  11.     NSString *bodyWidth= [webView stringByEvaluatingJavaScriptFromString: @"document.body.scrollWidth "];  
  12.     int widthOfBody = [bodyWidth intValue];  
  13.     //獲取實際要顯示的html  
  14.     NSString *html = [self htmlAdjustWithPageWidth:widthOfBody  
  15.                                               html:currentMail.htmlBody  
  16.                                            webView:webView];  
  17.     //設定為已經載入完成  
  18.     isLoadingFinished = YES;  
  19.     //載入實際要現實的html  
  20.     [self.webView loadHTMLString:html baseURL:nil];  
  21. }  
  22. //獲取寬度已經適配於webView的html。這裡的原始html也可以通過js從webView裡獲取  
  23. - (NSString *)htmlAdjustWithPageWidth:(CGFloat )pageWidth  
  24.                                  html:(NSString *)html  
  25.                               webView:(UIWebView *)webView  
  26. {  
  27.     NSMutableString *str = [NSMutableString stringWithString:html];  
  28.     //計算要縮放的比例  
  29.     CGFloat initialScale = webView.frame.size.width/pageWidth;  
  30.     //將</head>替換為meta+head  
  31.     NSString *stringForReplace = [NSString stringWithFormat:@"<meta name=\"viewport\" content=\" initial-scale=%f, minimum-scale=0.1, maximum-scale=2.0, user-scalable=yes\"></head>",initialScale];  
  32.     NSRange range =  NSMakeRange(0, str.length);  
  33.     //替換  
  34.     [str replaceOccurrencesOfString:@"</head>" withString:stringForReplace options:NSLiteralSearch range:range];  
  35.     return str;  
  36. }  


效果如下: