你可以这样做:
- (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:将两个字符串组合起来
//4:在UIWebView中执行javascript
要使其工作,HTML必须有<head></head>
个元素.
EDIT:
您还可以从本地css文件(本例中名为"styles.css")加载css字符串.只需将步骤//1替换为以下内容:
NSString *path = [[NSBundle mainBundle] pathForResource:@"styles" ofType:@"css"];
NSString *cssString = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
作为另一个选项,您可以将<link>
元素注入加载CSS文件的<head>
中:
- (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中时,你才能使用它.
UPDATE: WKWebView / Swift 3.x
当您使用WKWebView
时,由于WKWebView
的安全设置,<link>
元素不起作用.
您仍然可以将css作为字符串注入.要么在代码//1
中创建CSS字符串,要么将其放入本地文件//2
中.请注意,使用WKWebView时,必须使用WKNavigationDelegate
的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)
}