我成功地获取HTML内容并显示到我的UIWebView中.

但我们希望通过添加外部CSS文件来定制内容.我只能更改文本和字体的大小.我try 了所有可能的解决方案来进行更改,但它不起作用——它没有显示任何更改.

下面是我的代码

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

请帮我在我的视图中获取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:将两个字符串组合起来

//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时,必须使用WKNavigationDelegatewebView(_: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)
}

Objective-c相关问答推荐

TWTweetComposeViewController 在 IOS6 中已弃用

UIAlertController:supportedInterfaceOrientations 被递归调用

如何更改 UIButton 的突出显示 colored颜色 ?

UIRefreshControl iOS 6 xcode

获取按其各自值排序的 NSDictionary 键

Objective C 代码是否有 github markdown 语言标识符?

如何获取 NSArray 的最后一个对象

是否可以在 nsstring 中包含引号?

在objective-c / cocoa-touch中是否有一个方便的功能来找到最小的数字?

UITableView - Select 了哪一行?

如何编写 Objective-C 完成块

判断用户是否在连续的 UISlider 上完成滑动?

iOS 7 状态栏与 NavigationBar 冲突

Swift 3 - dynamic vs @objc

未找到 Apple Mach-O 链接器警告目录

具有高质量代码的开源 Objective-C 项目?

iPhone 键盘、完成按钮和 resignFirstResponder

检测 UITableView 滚动

@dynamic 在 Objective-C 中做了什么?

即使在静音模式下也能在 iPhone 上播放声音