UIWebView and local css file
I want to style a web page meant for the desktop so that it is presentable on a UIWebView on iPhone. I do not have access to the web server from which the pages originate. I would like to do this by changing the href
attribute of the <link>
stylesheet element programmatically.
I do the following with my IBOutlet UIWebView *webView
.
NSString *cssPath = [[NSBundle mainBundle] pathForResource:@"MyStyleSheet"
ofType:@"css"];
NSString *js = @"document.getElementsByTagName('link').setAttribute('href','";
NSString *js2 = [js stringByAppendingString:cssPath];
NSString *finalJS = [js2 stringByAppendingString:@"');"];
//check element structure
NSString *res = [webView stringByEvaluatingJavaScriptFromString:finalJS];
This does not work. Using the [webView stringByEvaluatingJavaScriptFromString:]
message and making a change t开发者_运维技巧o the backgroundColor
of the body does indeed work - done as an exercise to see if I was using the call correctly.
Am I barking up the wrong tree?
You can load CSS from local project directory
NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];
[webView loadHTMLString:htmlString baseURL:baseURL];
detail info check this site : http://iphoneincubator.com/blog/windows-views/uiwebview-revisited
Unfortunately UIWebView
doesn't provide an API for intercepting and modifying the requests that it makes while loading a resource. This means that any approach you try will be hack-ish to a certain extent.
The first approach I would try is:
- Provide your own
UIWebViewDelegate
delegate on the view. - Implement
-webView:shouldStartLoadWithRequest:navigationType:
and returnNO
when you spot the CSS requests being made. - Once the view has finished loading the main resource, use
-stringByEvaluatingJavaScriptFromString:
to inject JavaScript into the page that dynamically loads/sets the stylesheet that you want to use.
In the JavaScript I would create an entirely new <link>
element/node on the document instead of trying to modify the existing one.
Your code should work, if you choose index 0 of the found elements:
NSString *js = @"document.getElementsByTagName('link')[0].setAttribute('href','";
NSString *js2 = [js stringByAppendingString:cssPath];
NSString *finalJS = [js2 stringByAppendingString:@"');"];
[webview stringByEvaluatingJavaScriptFromString:finalJS];
You missed [0]
SWIFT 3
If you (like me) only use a html snippet (not a complete web page) you need to add your local css file in the header of the html snippet.
I therefore define a html header like this:
let htmlHeader = "<html> \n <head> \n <link href=\"default.css\" rel=\"stylesheet\" type=\"text/css\" /> \n </head> \n <body> \n"
and a footer like this:
let htmlFooter = "</body> \n </html>"
Then find the baseURL for the css like this:
let baseURLForCss = Bundle.main.url(forResource: "default", withExtension: "css")
And load the html snippet with your own css like this:
webView.loadHTMLString(String.init(format: "%@%@&@", htmlHeader, htmlSnippet, htmlFooter), baseURL: baseURLForCss)
精彩评论