在UIPopoverController中的UIWebView中显示Wiki移动页面

时间:2011-10-18 14:08:58

标签: uiwebview

我尝试通过UIPopoverController中的UIWebView打开wiki移动版网页。问题是,无论我如何设置我的contentSizeForViewInPopover,或只是UIWebView框架,或只是设置UIWebView.scalesPageToFit = YES。 Wiki移动版页面内容大小似乎比我的UIWebView大。但如果我在iPhone上使用它,就没有这样的问题。这是我的popover控制器代码:

//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;
}

所有代码似乎都很典型...... 我想知道是否有人能给我一些启示,非常感谢你。

3 个答案:

答案 0 :(得分:3)

这是auco答案的增强版本,如果视口元标记不存在,则会添加:

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

以下是我们在WebView中注入的宽度为320px的Javascript格式化代码

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);*/
} 

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

答案 1 :(得分:2)

哦,我发现在另一个QA中,有时如果html有一行“width = device-width”,并且你从popover控制器加载一个webview,这个popover控制器会自动发出设备宽度,而不是视图宽度你指定,让你的视图丑陋和时髦。在那篇文章中它是一个jQuery问题,它以jQuery方式解决。在我的问题中,它只是wiki移动版中的一个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;
    }
}
}
像这样的东西。

顺便说一下,因为我只在wiki移动版上使用它,所以html很简单,这种比较和替换非常简单。如果你想在更一般的情况下使用它,你可以使用其他方式。

答案 2 :(得分:2)

通过JavaScript 操作设备宽度而不是在完全加载之后更改html ,然后使用修改后的html重新加载整个页面会更有效率试。

这应该有用(并且还要考虑是否甚至需要更改视口宽度):

- (void)webViewDidFinishLoad:(UIWebView *)aWebView {
    if(aWebView.frame.size.width < aWebView.window.frame.size.width) {
        // width=device-width results in a wrong viewport dimension for webpages displayed in a popover
        NSString *jsCmd = @"var viewport = document.querySelector('meta[name=viewport]');";
        jsCmd = [jsCmd stringByAppendingFormat:@"viewport.setAttribute('content', 'width=%i, initial-scale=1.0, user-scalable=1');", (NSUInteger)aWebView.frame.size.width];
        [aWebView stringByEvaluatingJavaScriptFromString:jsCmd];
    }
    // stop network indicator
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
}