UIWebView - загрузить внешний веб-сайт, программно установить начальный масштаб масштабирования и разрешить пользователю масштабировать впоследствии - PullRequest
14 голосов
/ 08 ноября 2011

Возможно ли сделать все вышеперечисленное? SO дал мне отличный способ установить начальный масштаб увеличения здесь . А именно, чтобы включить в мой метод webViewDidFinishLoad следующую строку:

[webView stringByEvaluatingJavaScriptFromString: @"document.body.style.zoom = 5.0;"];

Но что я до сих пор не могу сделать, так это разрешить пользователю изменять масштаб увеличения после того, как программа его установит. Если я установлю scalePagesToFit на NO, пользователь не сможет изменить масштаб увеличения. И если я установлю scalePagesToFit на YES, это отменяет мой программный зум.

Может кто-нибудь помочь?

РЕДАКТИРОВАТЬ: спасибо за ответ. Но если я увеличу масштаб scrollView, все будет немного размыто.

Ответы [ 5 ]

40 голосов
/ 16 ноября 2011

Вы можете добавить или изменить тег <meta name='viewport' для достижения этой цели. Документация Apple по тегу meta / viewport здесь:

https://developer.apple.com/library/content/documentation/AppleApplications/Reference/SafariHTMLRef/Articles/MetaTags.html

Вот пример добавления тега после загрузки документа:

- (void) webViewDidFinishLoad:(UIWebView *)webView
{
    NSString* js = 
    @"var meta = document.createElement('meta'); " \
     "meta.setAttribute( 'name', 'viewport' ); " \
     "meta.setAttribute( 'content', 'width = device-width, initial-scale = 5.0, user-scalable = yes' ); " \
     "document.getElementsByTagName('head')[0].appendChild(meta)";

    [webView stringByEvaluatingJavaScriptFromString: js];        
}

Если загружаемая веб-страница содержит существующий метатег, вам может потребоваться изменить его, а не пытаться добавить новый метаэлемент в DOM. Этот ТАК вопрос обсуждает технику:

Могу ли я изменить метатег области просмотра в мобильном сафари на лету?

В моем тестовом приложении я установил UIWebView scalesPageToFit на ДА.

3 голосов
/ 31 мая 2013

Это на самом деле великолепно. Мне нужно было иметь возможность масштабирования, а scalePagesToFit НЕТ. Хотя ваш код TomSwift не работал так, как мне нужно, небольшая корректировка позволила.

Я запускаю это на iOS 6.x ... работает как шарм.

NSString* js =
        @"var meta = document.createElement('meta'); " \
        "meta.setAttribute( 'name', 'viewport' ); " \
        "meta.setAttribute( 'content', 'width = device-width, initial-scale=1.0, minimum-scale=0.2, maximum-scale=5.0; user-scalable=1;' ); " \
        "document.getElementsByTagName('head')[0].appendChild(meta)";

[webView stringByEvaluatingJavaScriptFromString: js]; 

Потрясающий совет Том.

3 голосов
/ 08 ноября 2011

Похоже, что базовый UIScrollView доступен начиная с iOS 5.x .

В webViewDidFinishLoad: вы можете запросить увеличение, например:

[webView.scrollView zoomToRect:CGRectMake(0.0, 0.0, 50.0, 50.0) animated:YES];

Кажется, это работает даже при scalesPageToFit, установленном на YES.

0 голосов
/ 09 ноября 2015

Разница с моим ответом в том, что вы очищаете область просмотра перед установкой ширины.

Это позволяет поворачивать или изменять размер веб-вида (после загрузки) без сброса изменений атрибутов.

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    // Clear view port
    NSString* js = @"$('meta[name=viewport]').remove();";
    [webView stringByEvaluatingJavaScriptFromString: js];

    // Set content size
    js = [NSString stringWithFormat:@"var meta = document.createElement('meta');"
          "meta.setAttribute( 'name', 'viewport' ); "
          "meta.setAttribute( 'content', 'width = device-width, initial-scale = 5.0, user-scalable = yes' ); "
          "document.getElementsByTagName('head')[0].appendChild(meta);"];

    [webView stringByEvaluatingJavaScriptFromString: js];
}
0 голосов
/ 15 ноября 2011

Попробуйте изменить порядок, в котором вы устанавливаете эти команды - сначала scalePagesToFit на YES, а затем:

[webView stringByEvaluatingJavaScriptFromString: @"document.body.style.zoom = 5.0;"];
...