перехватывать копировать, вставлять, определять popover в UIWebView - PullRequest
5 голосов
/ 11 января 2012

Когда мы выделяем текст в UIWebView, обычно появляется копия, вставка, определение и т. Д.Как я могу перехватить это, чтобы при выборе копирования я вызывал какой-то другой метод / делал что-то еще.Возможно ли это?

1 Ответ

6 голосов
/ 11 января 2012

Вы можете просто переопределить -copy:

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

Изменить, чтобы ответить на ваш комментарий.

Определить немного сложнее, так как это личное. Однако вы можете реализовать свой собственный метод. Настройте 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];

Затем вы реализуете эти методы.

Что касается определения, то оно намного сложнее. Во-первых, вам нужно проверить, есть ли определение у UIReferenceLibraryController, переопределив -canPerformAction: withSender:

- (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 + "}}";
}

Проверьте эту страницу , чтобы узнать, как внедрить JavaScript в UIWebView.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...