Форсировать содержимое HTML, чтобы оно соответствовало ширине устройства с помощью WkWebview

67
8

У меня есть WkWebview который должен показывать содержимое электронных писем HTML. Проблема в том, что иногда содержимое больше, чем окно, и поэтому для просмотра полного электронного письма требуется прокрутка.

Можно ли избежать этого и выполнить аналогичное поведение с тем, что происходит с почтовым приложением по умолчанию для iOS? Фактически, в приложении Mail кажется, что контент подходит, независимо от типа электронной почты.

спросил(а) 2018-02-21T14:52:00+03:00 2 года, 4 месяца назад
1
Решение
100

    WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
configuration.userContentController = [[WKUserContentController alloc] init];

NSString *source = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";

WKUserScript *script = [[WKUserScript alloc] initWithSource:source injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
[configuration.userContentController addUserScript:script];

self.webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration];

ответил(а) 2018-05-05T05:14:00+03:00 2 года, 1 месяц назад
38

стриж

Similar to @nferocious76 but in Swift language

var scriptContent = "var meta = document.createElement('meta');"
scriptContent += "meta.name='viewport';"
scriptContent += "meta.content='width=device-width';"
scriptContent += "document.getElementsByTagName('head')[0].appendChild(meta);"

webView.evaluateJavaScript(scriptContent, completionHandler: nil)

Цель C

NSString *jScript = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";

WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jScript injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
WKUserContentController *wkUController = [[WKUserContentController alloc] init];
[wkUController addUserScript:wkUScript];

WKWebViewConfiguration *wkWebConfig = [[WKWebViewConfiguration alloc] init];
wkWebConfig.userContentController = wkUController;

wkWebV = [[WKWebView alloc] initWithFrame:self.view.frame configuration:wkWebConfig];

ответил(а) 2018-05-09T17:04:00+03:00 2 года, 1 месяц назад
39

Если вы в порядке с масштабированием содержимого, вы можете отключить прокрутку и отключить автотрансляцию маски и установить NSLayoutConstraint, чтобы содержимое соответствовало требуемому размеру.

В приведенном ниже примере размер "негабаритного" html-документа составляет 80% ширины экрана, используя соотношение сторон 1:1. Он вертикально ограничен, чтобы располагаться близко к нижней части экрана. Разумеется, замените ограничения на любой размер, который вам нужен.

let configuration = WKWebViewConfiguration()
webView = WKWebView(frame: self.view.frame, configuration: configuration)
webView.translatesAutoresizingMaskIntoConstraints = false
webView.scrollView.isScrollEnabled = false

let height = NSLayoutConstraint(item: self.webView, attribute: .height, relatedBy: .equal, toItem: self.view, attribute: .width, multiplier: 0.8, constant: 0)
let width = NSLayoutConstraint(item: self.webView, attribute: .width, relatedBy: .equal, toItem: self.view, attribute: .width, multiplier: 0.8, constant: 0)

let horizontalCenter = NSLayoutConstraint(item: self.webView, attribute: .centerX, relatedBy: .equal, toItem: self.view, attribute: .centerX, multiplier: 1.0, constant: 0.0)
let bottomOffset = self.webView.frame.size.width * 0.1
let bottomConstraint = NSLayoutConstraint(item: self.bottomLayoutGuide, attribute: .top, relatedBy: .equal, toItem: self.webView, attribute: .bottom, multiplier: 1.0, constant: bottomOffset)

self.view.addConstraints([height, width, horizontalCenter, bottomConstraint])

ответил(а) 2018-05-06T17:33:00+03:00 2 года, 1 месяц назад
38

Вы можете достичь этого, добавив этот код после загрузки веб-страницы. То есть в этой функции в конце func webView (_ webView: WKWebView, didFinish navigation: WKNavigation!)


let jscript = "var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);"
let userScript = WKUserScript(source: jscript, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
let wkUController = WKUserContentController()
wkUController.addUserScript(userScript)
let wkWebConfig = WKWebViewConfiguration()
wkWebConfig.userContentController = wkUController
let yourWebView = WKWebView(frame: self.view.bounds, configuration: wkWebConfig)// yourwebview is the webview that you are using.

ответил(а) 2018-02-21T15:44:00+03:00 2 года, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема