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 to 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?

Answers


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 return NO 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)

Need Your Help

Make pm2 log to console

node.js pm2

I am running a node webserver using pm2. Since pm2 spawns another process and redirects stdout and stderr to files, I have to look somewhere else for the logs. Ideally, I would like to have the node

Is an array a primitive type or an object (or something else entirely)?

java arrays object primitive

The question is basically self-explanatory. I haven't been able to find an API for arrays (other than this Arrays, but this just defines a bunch of static helper functions for dealing with actual ...