UIWebView и локальный файл CSS - PullRequest
17 голосов
/ 09 января 2010

Я хочу стилизовать веб-страницу, предназначенную для рабочего стола, чтобы она отображалась в UIWebView на iPhone. У меня нет доступа к веб-серверу, с которого происходят страницы. Я хотел бы сделать это путем программного изменения атрибута href элемента <link> таблицы стилей.

Я делаю следующее с моим 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]; 

Это не работает. Использование сообщения [webView stringByEvaluatingJavaScriptFromString:] и внесение изменений в backgroundColor тела действительно работает - выполняется как упражнение, чтобы проверить, правильно ли я использовал вызов.

Я лаю не на том дереве?

Ответы [ 4 ]

26 голосов
/ 18 февраля 2010

Вы можете загрузить CSS из локальной директории проекта

NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];
[webView loadHTMLString:htmlString baseURL:baseURL];

подробная информация проверить этот сайт: http://iphoneincubator.com/blog/windows-views/uiwebview-revisited

5 голосов
/ 20 января 2010

К сожалению, UIWebView не предоставляет API для перехвата и изменения запросов, которые он делает при загрузке ресурса.Это означает, что любой подход, который вы попробуете, будет в некоторой степени хакерским.

Первый подход, который я бы попробовал:

  • Предоставьте свой собственный UIWebViewDelegate делегат для представления.
  • Реализовать -webView:shouldStartLoadWithRequest:navigationType: и вернуть NO, когда вы заметили, что выполняются запросы CSS.
  • Как только представление завершит загрузку основного ресурса, используйте -stringByEvaluatingJavaScriptFromString:, чтобы вставить JavaScript встраница, которая динамически загружает / устанавливает таблицу стилей, которую вы хотите использовать.

В JavaScript я бы создал совершенно новый элемент / узел <link> в документе вместо попытки изменить существующий.

2 голосов
/ 03 января 2017

SWIFT 3

Если вы (как и я) используете только фрагмент HTML (не полную веб-страницу), вам нужно добавить свой локальный файл CSS в заголовок фрагмента HTML.

Поэтому я определяю HTML-заголовок следующим образом:

let htmlHeader = "<html> \n <head> \n <link href=\"default.css\" rel=\"stylesheet\" type=\"text/css\" /> \n </head> \n <body> \n"

и нижний колонтитул, подобный этому:

let htmlFooter = "</body> \n </html>"

Затем найдите baseURL для css следующим образом:

let baseURLForCss = Bundle.main.url(forResource: "default", withExtension: "css")

И загрузите фрагмент HTML с вашим собственным CSS следующим образом:

webView.loadHTMLString(String.init(format: "%@%@&@", htmlHeader, htmlSnippet, htmlFooter), baseURL: baseURLForCss)
2 голосов
/ 22 декабря 2010

Ваш код должен работать, если вы выбрали индекс 0 найденных элементов:

    NSString *js = @"document.getElementsByTagName('link')[0].setAttribute('href','";
    NSString *js2 = [js stringByAppendingString:cssPath];
    NSString *finalJS = [js2 stringByAppendingString:@"');"];
    [webview stringByEvaluatingJavaScriptFromString:finalJS];

Вы пропустили [0]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...