2011-10-18 32 views
2

我嘗試通過UIPopoverController內的UIWebView來打開維基手機版本的網頁。問題是,無論我如何設置我的contentSizeForViewInPopover,或只是UIWebView框架,或簡單地設置UIWebView.scalesPageToFit = YES。 Wiki移動版本頁面的內容大小似乎比我的UIWebView大。但是如果我在iPhone上使用它,就沒有這樣的問題。這裏是我的酥料餅的控制器代碼:在UIPopoverController中的UIWebView中顯示維基移動頁面

//create a UIWebView UIViewController first 
WikiViewController *addView = [[WikiViewController alloc] init]; 
addView.contentSizeForViewInPopover = CGSizeMake(320.0, 480.0f); 

//then create my UIPopoverController 
popover = [[UIPopoverController alloc] initWithContentViewController:addView]; 
popover.delegate = self; 
[addView release]; 

//then get the popover rect 
CGPoint pointforPop = [self.mapView convertCoordinate:selectAnnotationCord 
             toPointToView:self.mapView]; 
CGRect askRect = CGRectMake((int)pointforPop.x, (int)pointforPop.y+10, 1.0, 1.0); 
[popover presentPopoverFromRect:askRect 
         inView:self.mapView 
     permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES]; 
[self.mapView deselectAnnotation:annotation animated:YES]; 

,這是我創造的UIWebView代碼:

- (void)viewDidLoad 
{ 
wikiWebView = [[UIWebView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 480.0f)]; 
wikiWebView.scalesPageToFit = YES; 
//or No, doesn't matter, it all get larger than this 
wikiWebView.delegate = self; 
self.view = wikiWebView; 
} 

所有代碼似乎是典型的... 我想知道如果任何人都可以擺脫我一些光,非常感謝。

回答

2

哦,我發現在另一個QA中,有時如果html有一行「width = device-width」,並且你從popover控制器加載webview,這個popover控制器會自動發送設備寬度,而不是視圖寬度你指定,並使你的視圖醜陋和時髦。在那篇文章中,它是一個jQuery問題,並用jQuery方式解決。在我的問題中,這只是維基手機版的html問題。所以我嘗試另一種方式,但類似。

我簡單地在webViewdidload委託方法中添加代碼,首先將URL html轉換爲NSString,然後使用NSString實例方法在加載的html中搜索「device-width」,並將其替換爲我的視圖寬度以使其成爲新的NSString,然後用這個新的NSString加載這個頁面。而已。

- (void) webViewDidFinishLoad:(UIWebView *)webView 
{ 
if (!alreadyReload) 
{ 
    NSString *webHTML = [NSString stringWithContentsOfURL:webView.request.URL encoding:NSUTF8StringEncoding error:NULL]; 
    NSRange range = [webHTML rangeOfString:@"device-width"]; 
    if ((range.location!=NSNotFound)&&(range.length != 0)) 
    { 
     webHTML = [webHTML stringByReplacingOccurrencesOfString:@"device-width" withString:@"whatever width you need" options:0 range:range]; 
     [webView loadHTMLString:webHTML baseURL:wikiWebView.request.URL]; 
     alreadyReload = YES; 
    } 
} 
} 

這樣的事情。

順便說一下,由於我只在維基手機版上使用這個,所以html很簡單,這種比較和替換很容易。如果你想在更一般的情況下使用它,你可以使用其他方式。

2

這將是更有效的操縱裝置寬度通過JavaScript,而不是改變HTML 它完全加載,然後再重裝與修改後的HTML完整的頁面。

這應該工作(並考慮如果它甚至需要改變視口寬度):

​​
3

這是AUCO答案,在這裏,如果視meta標籤不存在,這將是一個加強版補充:

- (void)webViewDidFinishLoad:(UIWebView*)webView 
{ 
    int webviewWidth = (NSUInteger)webView.frame.size.width; 

    if (!webView.loading) { 

     NSString *jsCmd = [NSString stringWithFormat:@"try {var viewport = document.querySelector('meta[name=viewport]');if (viewport != null) {viewport.setAttribute('content','width=%ipx, initial-scale=1.0, user-scalable=1');} else {var viewPortTag=document.createElement('meta');viewPortTag.id='viewport';viewPortTag.name = 'viewport';viewPortTag.content = 'width=%ipx, initial-scale=1.0, user-scalable=1';document.getElementsByTagName('head')[0].appendChild(viewPortTag);}} catch (e) {/*alert(e);*/}", webviewWidth, webviewWidth]; 

     [webView stringByEvaluatingJavaScriptFromString:jsCmd]; 
    } 
} 

以下是我們在與web視圖的320px的

try { 
    var viewport = document.querySelector('meta[name=viewport]'); 
    if (viewport != null) { 
     viewport.setAttribute('content', 
       'width=320px, initial-scale=1.0, user-scalable=1'); 
    } else { 
     var viewPortTag = document.createElement('meta'); 
     viewPortTag.id = 'viewport'; 
     viewPortTag.name = 'viewport'; 
     viewPortTag.content = 'width=320px,initial-scale=1.0, user-scalable=1'; 
     document.getElementsByTagName('head')[0].appendChild(viewPortTag); 
    } 
} catch (e) { 
    /*alert(e);*/ 
} 
寬度注入的JavaScript漂亮格式化代碼

如果需要,您可以刪除try/catch。