gpt4 book ai didi

iphone - 拦截复制、粘贴、定义 UIWebView 中的 popover

转载 作者:可可西里 更新时间:2023-11-01 04:36:32 27 4
gpt4 key购买 nike

当我们在 UIWebView 中突出显示文本时,通常会出现复制、粘贴、定义等。我怎样才能拦截它,以便在我选择复制时调用其他方法/做其他事情。这可能吗?

最佳答案

你可以简单地覆盖-copy:

- (void)copy:(id)sender
{
// Do something else here
return [super copy:sender];
}

编辑以回答您的评论。

Define 有点棘手,因为它是私有(private)的。但是,您可以实现自己的方法。使用您想要的项目设置 UIMenuController。

UIMenuItem *copyItem = [[UIMenuItem alloc] initWithTitle:@"Copy" 
action:@selector(myCopy:)];

UIMenuItem *defineItem = [[UIMenuItem alloc] initWithTitle:@"Define"
action:@selector(myDefine:)];

[[UIMenuController sharedMenuController] setMenuItems:[NSArray arrayWithObjects:defineItem, copyItem, nil]];
[defineItem release];
[copyItem release];

然后你实现这些方法。

至于定义,它要复杂得多。首先,您需要通过覆盖 -canPerformAction:withSender: 检查 UIReferenceLibraryController 是否有定义:

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender 
{
if (action == @selector(myDefine:)) {
// Make sure we are on iOS5.x
if (NSClassFromString(@"UIReferenceLibraryViewController")) {
return [UIReferenceLibraryViewController dictionaryHasDefinitionForTerm:[webView selectedText]];
}
}
// Implement other custom actions here
return NO;
}

-selectedText 是 UIWebView 上的一个类别:

- (NSString *)selectedText {
return [self stringByEvaluatingJavaScriptFromString:@"window.getSelection().toString()"];
}

然后你需要实现myDefine:

- (void)myDefine:(UIMenuController *)menuController 
{
CGRect selectedWordFrame = [webView rectForSelectedText];

UIReferenceLibraryViewController *dict = [[UIReferenceLibraryViewController alloc] initWithTerm:[webView selectedText]];
UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:dict];
[popover presentPopoverFromRect:selectedWordFrame
inView:webView
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
[popover setDelegate:self];
[dict release];
}
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
[popoverController release];
}

编辑以再次回复您的评论

-rectForSelectedText 是 UIWebView 上的另一个自定义类别。

- (CGRect)rectForSelectedText {
return CGRectFromString([self stringByEvaluatingJavaScriptFromString:@"getRectForSelectedWord()"]);
}

它所做的是调用一个 javascript 返回一个字符串,您可以使用 CGRectFromString() 转换它,它看起来像这样:

function getRectForSelectedWord() {
var selection = window.getSelection();
var range = selection.getRangeAt(0);
var rect = range.getBoundingClientRect();
return "{{" + rect.left + "," + rect.top + "}, {" + rect.width + "," + rect.height + "}}";
}

检查 this page学习如何将 javascript 注入(inject) UIWebView。

关于iphone - 拦截复制、粘贴、定义 UIWebView 中的 popover,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8823906/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com