отображение мобильной страницы Wiki в UIWebView в UIPopoverController - PullRequest
2 голосов
/ 18 октября 2011

Я пытаюсь открыть веб-страницу мобильной версии вики с помощью UIWebView в UIPopoverController. проблема не в том, как установить мой 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 ]

3 голосов
/ 21 июня 2013

Это расширенная версия ответа auco, в которой, если метатег viewport отсутствует, он будет добавлен:

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

Вот довольно отформатированный код Javascript, который мы внедряем в WebView с шириной 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);*/
} 

вы можете удалить пробную версию, если хотите.

2 голосов
/ 21 декабря 2012

Было бы гораздо эффективнее манипулировать шириной устройства с помощью 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;
}
2 голосов
/ 20 октября 2011

о, я обнаружил в другом QA, что иногда, если html получил строку "width = device-width", и вы загружаете веб-просмотр из контроллера popover, этот контроллер popover будет автоматически отправлять ширину устройства, а не ширину просмотра, которую выуточняйте, и сделайте ваш взгляд уродливым и прикольным.в этом посте это проблема jQuery, и она решена с помощью jQuery.В моей проблеме, это просто проблема HTML в мобильной версии Wiki.поэтому я пробую другой способ, но похожий.

Я просто добавляю код в метод делегата webViewdidload, сначала получаю URL html в NSString, затем использую метод экземпляра NSString для поиска «device-width» в загруженном html,и замените его шириной моего вида, чтобы сделать его новой 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 прост, а сравнять и заменять довольно легко,если вы хотите использовать его в более общем случае, вы можете использовать другой способ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...