17

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?

4 Answers 4

26

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

Sign up to request clarification or add additional context in comments.

1 Comment

The css file is loaded by a declaration in the html header - like this: <link href="default.css" rel="stylesheet" type="text/css" /> Then you need to set the baseURL to the directory where the default.css file can be found.
5

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.

1 Comment

I don't think that -webView:shouldStartLoadWithRequest:navigationType: will be called when loading a css resource.
2

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]

Comments

2

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.