Подтвердить что ты не робот

UIWebView - загрузка внешнего веб-сайта, программно заданная начальная шкала масштабирования и позволяющая пользователю увеличивать масштаб

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

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

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

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

EDIT: спасибо за ответ. Но если я увеличу scrollView, все немного размывается.

4b9b3361

Ответ 1

Вы можете добавить или изменить тег <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. Этот вопрос SO обсуждает технику:

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

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

Ответ 2

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

В webViewDidFinishLoad: вы можете запросить масштабирование, например:

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

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

Ответ 3

Это действительно блестяще. Мне нужно было иметь возможность масштабирования, а 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]; 

Удивительный совет Том.

Ответ 4

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

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

Ответ 5

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

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

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