うまくいく解決策がありますが、もっと良い方法があると思います。
UIWebView を継承する TouchableWebView を作成し、hitTest メソッドでタッチ位置を保存します。その後、webview のデリゲートを設定し、メソッドを実装する必要があります。-webView:shouldStartLoadWithRequest:navigationType:
TouchableWebView.h :
@interface TouchableWebView : UIWebView {
CGPoint lastTouchPosition;
}
@property (nonatomic, assign) CGPoint lastTouchPosition;
TouchableWebView.m :
// I need to retrieve the touch position in order to position the popover
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
self.lastTouchPosition = point;
return [super hitTest:point withEvent:event];
}
RootViewController.m で:
[self.touchableWebView setDelegate:self];
// WebView delegate, when hyperlink clicked
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
if (navigationType == UIWebViewNavigationTypeLinkClicked)
{
CGPoint touchPosition = [self.view convertPoint:self.touchableWebView.lastTouchPosition fromView:self.touchableWebView];
[self displayPopOver:request atPosition:touchPosition isOnCelebrityFrame:FALSE];
return FALSE;
}
return TRUE;
}
のドキュメントにUIWebView
は、サブクラス化すべきではないと書かれているため、良くありません。もっと良い方法があると思いますが、これはうまくいきます。別の解決策を見つけましたか?