[iPhone] Hack UIWebView〜コンパイル2
続いて,UIWebViewをハックしていきます.
HMDTさんと同じようなことができるような実装をしてみました.
※参考リンク
・HMDT:プログレスバーを表示する
・コンパイル
まず,WebViewをさわるので,WebView.hをincludeします.
しかし,ちょっといじらないとコンパイルできません.
diff -t ./include.backup112/WebKit/WebFrame.h ./include/WebKit/WebFrame.h 7c7 < #import "NSObject.h" --- > //#import "NSObject.h" Only in ./include/WebKit: WebFrame.h~ diff -t ./include.backup112/WebKit/WebView.h ./include/WebKit/WebView.h 7c7 < #import "WAKView.h" --- > #import <WebCore/WAKView.h> //#import "WAKView.h" Only in ./include/WebKit: WebView.h~
というように,引っかかってくるエラーに対応します.
さらに,以下のエラーにも対応します.
diff -t ./include.backup112/WebCore/WAKResponder.h ./include/WebCore/WAKResponder.h 7c7 < #import "NSObject.h" --- > //#import "NSObject.h" Only in ./include/WebCore: WAKResponder.h~
修正するファイルは,以下となります.
・WebKit/WebView.h
・WebKit/WebFrame.h
・WebCore/WAKResponder.h
さらに,ある構造体の定義ができていないので,適当にどこかで宣言して補います.
(WebCore/CDStructures.hをそのまま使いたいのだが,ちょっとエラーが多すぎて,対応するのがめんどいので場当たりで対応しました.)
struct _WKViewContext { void *drawCallback; void *drawUserInfo; void *eventCallback; void *eventUserInfo; void *notificationCallback; void *notificationUserInfo; void *layoutCallback; void *layoutUserInfo; void *responderCallback; void *responderUserInfo; void *hitTestCallback; void *hitTestUserInfo; void *willRemoveSubviewCallback; };
・ソースコード
まず,いくつかのデリゲートメッセージを利用するため,とりあえず,全部Delegateをセット.
// set delegate id webView = [uiWebView_ webView]; [webView setResourceLoadDelegate:self]; [webView setDownloadDelegate:self]; [webView setFrameLoadDelegate:self];
以下,デリゲートメソッド.
HMDTさんのサイトまんまですが・・・.引用です.
didStartProvisionalLoadForFrameで,インジケータをスタートさせて,リソースのロード終了メッセージのタイミングでインジケータをストップするかを判断するように実装しています.
- (void)webView:(WebView*)sender didStartProvisionalLoadForFrame:(WebFrame*)frame { if (frame == [sender mainFrame]) { resourceCount_ = 0; resourceCompletedCount_ = 0; resourceFailedCount_ = 0; [UIApp setStatusBarShowsProgress:YES]; } } - (id)webView:(WebView*)sender identifierForInitialRequest:(NSURLRequest*)request fromDataSource:(WebDataSource*)dataSource { NSNumber*number; number = [NSNumber numberWithInt:resourceCount_++]; return number; } - (void)webView:(WebView*)sender resource:(id)identifier didFailLoadingWithError:(NSError*)error fromDataSource:(WebDataSource*)dataSource { resourceFailedCount_++; [self controlSyndicator]; } - (void)webView:(WebView*)sender resource:(id)identifier didFinishLoadingFromDataSource:(WebDataSource*)dataSource { resourceCompletedCount_++; [self controlSyndicator]; } - (void) controlSyndicator { int downloadedCount = resourceCompletedCount_ + resourceFailedCount_; if( downloadedCount == resourceCount_ ) { [UIApp setStatusBarShowsProgress:NO]; } }