2012-01-11 2 views
4

일반적으로 UIWebView에서 텍스트를 강조 표시하면 복사, 붙여 넣기, 정의 .. 등이 나타납니다. 나는 이것을 가로 챌 수있어서 복사본을 선택할 때 다른 메소드를 호출하거나 다른 것을한다. 이것이 가능한가?intercept copy, paste, popover in UIWebView

+1

샘플 : http://goo.gl/lLJpL – elp

답변

6

당신은 단순히 -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]; 

그런 다음 해당 메소드를 구현합니다.

- (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에 범주입니다 : withSender :

은에 관해서는 먼저, UIReferenceLibraryController이 정의가있는 경우 -canPerformAction를 재정 의하여, 확인해야합니다 ..이 방법이 더 복잡 정의 :

- (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의 또 다른 사용자 지정 범주입니다.

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있는 UIWebView에 자바 스크립트를 삽입하는 방법을 배울 수 : 당신이 CGRectFromString()를 사용하여 변환 할 수있는 문자열을 반환 자바 스크립트를 호출 무엇

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

, 그것은 다음과 같이 보입니다 .

+0

다른 샘플은 어떻습니까? – adit

+0

아 그리고 방법에 의해 이것은 아이폰에 그래서 내가 그것을 시도, UIUserInterfaceIdiomPad – adit

+0

아래도 실행되지 때 전화를 준다이 세 메뉴 popover, 복사, 정의, 정의를 제공합니다 – adit