gpt4 book ai didi

ios - 在 UIWebView/WKWebView 中将 CSS 插入加载的 HTML

转载 作者:IT王子 更新时间:2023-10-29 07:49:42 24 4
gpt4 key购买 nike

我能够成功获取 HTML 内容并显示到我的 UIWebView 中。

但是想通过添加外部CSS文件来自定义内容。我只能更改文本和字体的大小。我尝试了所有可能的解决方案来进行更改,但它不起作用 - 它没有显示任何更改。

下面是我的代码

HTMLNode* body = [parser body];
HTMLNode* mainContentNode = [body findChildWithAttribute:@"id" matchingName:@"main_content" allowPartial:NO];
NSString *pageContent = [NSString stringWithFormat:@"%@%@", cssString, contentHtml];
[webView loadHTMLString:pageContent baseURL:[NSURL URLWithString:@"http://www.example.org"]];

-(void)webViewDidFinishLoad:(UIWebView *)webView1{
int fontSize = 50;
NSString *font = [[NSString alloc] initWithFormat:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '%d%%'", fontSize];
NSString *fontString = [[NSString alloc] initWithFormat:@"document.getElementById('body').style.fontFamily=\"helvetica\""];

[webView1 stringByEvaluatingJavaScriptFromString:fontString];
[webView1 stringByEvaluatingJavaScriptFromString:font];
}

请帮我在我的 View 中获取 css 样式表。

最佳答案

你可以这样做:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSString *cssString = @"body { font-family: Helvetica; font-size: 50px }"; // 1
NSString *javascriptString = @"var style = document.createElement('style'); style.innerHTML = '%@'; document.head.appendChild(style)"; // 2
NSString *javascriptWithCSSString = [NSString stringWithFormat:javascriptString, cssString]; // 3
[webView stringByEvaluatingJavaScriptFromString:javascriptWithCSSString]; // 4
}

这段代码的作用:

//1 : 定义一个包含所有CSS声明的字符串

//2 : 定义一个 javascript 字符串来创建一个新的 <style> HTML DOM 元素并将 CSS 声明插入其中。实际上插入是在下一步完成的,现在只有%@。占位符。我这样做是为了防止线路变得太长,但是步骤 2 和步骤 3 可以一起完成。

//3 : 合并2个字符串

//4 : 在 UIWebView 中执行 javascript

为此,您的 HTML 必须有一个 <head></head>元素。

编辑:

您还可以从本地 css 文件(在本例中名为“styles.css”)加载 css 字符串。只需将步骤//1 替换为以下内容:

NSString *path = [[NSBundle mainBundle] pathForResource:@"styles" ofType:@"css"];
NSString *cssString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

作为另一种选择,您可以只注入(inject) <link>元素到 <head>加载 CSS 文件:

- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSString *path = [[NSBundle mainBundle] pathForResource:@"styles" ofType:@"css"];
NSString *javascriptString = @"var link = document.createElement('link'); link.href = '%@'; link.rel = 'stylesheet'; document.head.appendChild(link)";
NSString *javascriptWithPathString = [NSString stringWithFormat:javascriptString, path];
[webView stringByEvaluatingJavaScriptFromString:javascriptWithPathString];
}

此解决方案最适合大型 CSS 文件。不幸的是,它不适用于远程 HTML 文件。只有当您想要将 CSS 插入已下载到您的应用程序的 HTML 中时,您才能使用它。

更新:WKWebView/Swift 3.x

当您使用 WKWebView 时注入(inject) <link>由于 WKWebView,元素无法正常工作的安全设置。

您仍然可以将 css 作为字符串注入(inject)。在您的代码中创建 CSS 字符串 //1或者放在本地文件中 //2 .请注意,使用 WKWebView 您必须在 WKNavigationDelegate 中进行注入(inject)的 webView(_:didFinish:)方法:

func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
insertCSSString(into: webView) // 1
// OR
insertContentsOfCSSFile(into: webView) // 2
}

func insertCSSString(into webView: WKWebView) {
let cssString = "body { font-size: 50px; color: #f00 }"
let jsString = "var style = document.createElement('style'); style.innerHTML = '\(cssString)'; document.head.appendChild(style);"
webView.evaluateJavaScript(jsString, completionHandler: nil)
}

func insertContentsOfCSSFile(into webView: WKWebView) {
guard let path = Bundle.main.path(forResource: "styles", ofType: "css") else { return }
let cssString = try! String(contentsOfFile: path).trimmingCharacters(in: .whitespacesAndNewlines)
let jsString = "var style = document.createElement('style'); style.innerHTML = '\(cssString)'; document.head.appendChild(style);"
webView.evaluateJavaScript(jsString, completionHandler: nil)
}

关于ios - 在 UIWebView/WKWebView 中将 CSS 插入加载的 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33123093/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com