2

カスタム アクションを UIMenuController に追加しました。アクションがクリックされると、「定義」アクションの動作と同じようにポップオーバーが表示されるようにします (下のスクリーンショットを参照)。

のときに表示されるポップオーバー

ただし、UIWebView 内でポップオーバーを正しく配置することができません。ユーザーがカスタム アクションを選択したときにポップオーバーを生成するコードの抜粋を次に示します。

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
    popover = [[UIPopoverController alloc]
                         initWithContentViewController:contentController];
    [popover setDelegate:self];
    popover.popoverContentSize = CGSizeMake(240., 60.);
    UIMenuController *menuController = [UIMenuController sharedMenuController];

    [popover presentPopoverFromRect:menuController.menuFrame
                             inView:webView
           permittedArrowDirections:UIPopoverArrowDirectionAny
                           animated:YES];
}

デバイスが縦向きモードの場合の結果は次のとおりです。

ポップオーバーの結果の位置

ご覧のとおり、それほど悪くはありませんが、選択したテキストに正確に合わせることができません。ランドスケープモードでは、ポップオーバーの位置は近くさえありません。

選択したテキストにポップオーバーを正しく配置し、ユーザーがデバイスを回転させたときにポップオーバーを正しく配置する方法を知っている人はいますか? SDK のバージョンは iOS 6.1 です。

4

2 に答える 2

1

Javascript コードを使用して、選択したテキストから CGRect を返すことができます。file.js を作成し、次のコードを追加します (または NSString に配置します)。

// Method that gets the Rect of current selected text
// and returns in a JSON format
var getRectForSelectedText = function(elm) {
    if (typeof elm === "undefined") {
        elm = window.getSelection().getRangeAt(0);
    }

    var rect = elm.getBoundingClientRect();
    return "{{" + rect.left + "," + rect.top + "}, {" + rect.width + "," + rect.height + "}}";
}

Javascript を読み込む (ファイルまたは NSString)

- (void)webViewDidFinishLoad:(UIWebView *)theWebView
{
    //Load JS file
    NSString *filePath  = [[NSBundle mainBundle] pathForResource:@"file" ofType:@"js"];
    NSData *fileData    = [NSData dataWithContentsOfFile:filePath];
    NSString *jsString  = [[NSMutableString alloc] initWithData:fileData encoding:NSUTF8StringEncoding];

    [self.webview stringByEvaluatingJavaScriptFromString:jsString];
}

ポップオーバーが表示されます:

CGRect rect = CGRectFromString([self.webview stringByEvaluatingJavaScriptFromString:@"getRectForSelectedText()"]);

[popover presentPopoverFromRect:rect
                         inView:webView
       permittedArrowDirections:UIPopoverArrowDirectionAny
                       animated:YES];

self.view で rect を使用する必要がある場合は、フレームを調整します。

- (CGRect)rectForSelectedText
{
    CGRect rect = CGRectFromString([self.webview stringByEvaluatingJavaScriptFromString:@"getRectForSelectedText()"]);
    rect.origin.x += self.webview.frame.origin.x;
    rect.origin.y += self.webview.frame.origin.y;
    return rect;
}

お役に立てば幸いです!

于 2013-04-11T13:09:33.713 に答える