ローカルファイルのHTMLをUIWebViewに表示させる
xibで用意したUIWebViewにローカルHTMLファイルを読み込ませたいとき、躓いた点があったので備忘。
ローカルHTMLをUIWebViewに表示
まずはローカルHTMLをUIWebViewに表示させるまで。
ヘッダファイルにプロパティを追加しておく。
@interface HogehogeViewController : UIViewController<UIWebViewDelegate>{ IBOutlet UIWebView *webView; } @property (weak, nonatomic) IBOutlet UIWebView *webView; @end
viewDidLoad内で表示させるHTMLファイルの指定。
- (void)viewDidLoad{ [super viewDidLoad]; _webView.scalesPageToFit = YES; _webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); NSString *path = [[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"html"]; NSFileHandle *readHandle = [NSFileHandle fileHandleForReadingAtPath:path]; _webView.delegate = self; NSString *htmlString = [[NSString alloc] initWithData:[readHandle readDataToEndOfFile] encoding:NSUTF8StringEncoding]; [_webView loadHTMLString:htmlString baseURL:[NSURL fileURLWithPath:path]]; }
こんな感じ。
viewDidLoad内で何やってるか簡単に書くと・・・
ビューに対してフィットした状態で表示し、かつピンチズーム&アウトできるように。
_webView.scalesPageToFit = YES; _webView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
ファイル名hoge、拡張子htmlを指定してファイルパスを取得。
NSString *path = [[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"html"]; NSFileHandle *readHandle = [NSFileHandle fileHandleForReadingAtPath:path];
UTF8でエンコーディング。
NSString *htmlString = [[NSString alloc] initWithData:[readHandle readDataToEndOfFile] encoding:NSUTF8StringEncoding];
表示。
[_webView loadHTMLString:htmlString baseURL:[NSURL fileURLWithPath:path]];
ただ、これだけではうまくいかないことがある。
HTMLファイル内にjavascriptやcssを全て記載しておくならば問題ないだろうけど、
まぁそういう書き方ってしないよな。。。
HTMLファイルから更に別ファイルを参照している場合、HTMLファイル内のファイルパスを気をつける必要がある。
単純にファイルパスは必要ないっぽい。
<link href="hogehoge.css" rel="stylesheet"> <script src="hogehofe.js"></script>
そして問題は、javascript....
jsファイルをプロジェクトに追加するとCompile Sourcesに追加されコンパイルエラーになる。
PROJECT>TARGETS>Build Phases>Compile Sourcesを確認。
対象のjsファイルをドラッグドロップでCompile Sourcesの下にあるCopy Bundle Resourcesに移動してあげる。
ここまでやって、やっと表示することができる。
UIWebViewのgoBackが効かない
ローカルHTMLファイルを表示せると、goBackやgoForwardやcanGoBackやcanGoForwardがおかしなことになる。
解決方法はなく、したの回避方法が一般的っぽい。
・UIWebView won't goBack after loading HTML in iOS
これでやっと目的の状態(に近い状態・・・)になりました。
ローカルHTMLのとき、戻るとかが変なのはバグ?随分前から話題にはなってるようなんだけどな・・・