UIWebView - загрузка внешнего веб-сайта, программно заданная начальная шкала масштабирования и позволяющая пользователю увеличивать масштаб
Можно ли все это вывести? SO дала мне отличный способ установить начальный масштаб масштабирования здесь. А именно, чтобы включить в мой метод webViewDidFinishLoad следующую строку:
[webView stringByEvaluatingJavaScriptFromString: @"document.body.style.zoom = 5.0;"];
Но то, что я все еще не могу сделать, это позволить пользователю изменить масштаб масштабирования после того, как программа изначально устанавливает его. Если я установил значение scalePagesToFit равным NO, пользователь не сможет изменить масштаб масштабирования. И если я установил scalePagesToFit в YES, он переопределит мой программный зум.
Может ли кто-нибудь помочь?
EDIT: спасибо за ответ. Но если я увеличу scrollView, все немного размывается.
Ответы
Ответ 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];
}