[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];
}
}