[ios] UIWebView에서 사용자 선택 비활성화

콘텐츠를에로드하고이를 표시하는 앱 UIWebView이 있습니다. 사용자가 링크를 클릭 할 수 있기를 원하기 때문에 사용자 상호 작용을 완전히 비활성화 할 수 없습니다. 사용자 선택을 비활성화하면됩니다. 인터넷에서 사용할 수있는 곳을 찾았습니다.

document.body.style.webkitUserSelect='none';

나는 이것을 다음과 같이 삽입하려고 시도했다.

[self.contentView stringByEvaluatingJavaScriptFromString:@"document.body.style.webkitUserSelect='none';"]; 

webViewDidFinishLoad:

그러나 작동하지 않습니다. WebView 내에서 여전히 텍스트를 선택하고 복사 할 수 있습니다.

어떤 아이디어가 잘못 될 수 있습니까?

업데이트 : 이것은 iOS 4.3부터 만 발생하는 것 같습니다.



답변

선택을 비활성화하는 몇 가지 방법은 다음과 같습니다.

모바일 웹 문서에 다음을 추가하십시오.

<style type="text/css">
* {
    -webkit-touch-callout: none;
    -webkit-user-select: none; /* Disable selection/copy in UIWebView */
}
</style>

다음 자바 스크립트 코드를 프로그래밍 방식으로로드합니다.

NSString * jsCallBack = @"window.getSelection().removeAllRanges();";
[webView stringByEvaluatingJavaScriptFromString:jsCallBack];

복사 / 붙여 넣기 사용자 메뉴 비활성화 :

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    if (action == @selector(copy:) ||
        action == @selector(paste:)||
        action == @selector(cut:))
    {
        return _copyCutAndPasteEnabled;
    }
    return [super canPerformAction:action withSender:sender];
}


답변

다음 코드가 iOS 5.0-8.0에서 작동하는지 확인할 수 있습니다.

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    // Disable user selection
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
    // Disable callout
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
}

iOS 9 이상에서도 작동합니다. 다음은 빠른 코드입니다.

func webViewDidFinishLoad(webView: UIWebView) {
    // Disable user selection
    webView.stringByEvaluatingJavaScriptFromString("document.documentElement.style.webkitUserSelect='none'")!
    // Disable callout
    webView.stringByEvaluatingJavaScriptFromString("document.documentElement.style.webkitTouchCallout='none'")!
}


답변

Android / iPhone 용 웹 앱 (Trigger.IO 패키지)에서이 기술을 사용하고 있으며 : not () 의사 클래스에 대한 연결 구문에서만 작동한다는 것을 알았습니다.

*:not(input):not(textarea) {
-webkit-user-select: none; /* disable selection/Copy of UIWebView */
    -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */

}


답변

저는 WrightsCS 솔루션을 좋아하지만 사용자가 입력에 대한 작업을 복사, 붙여 넣기 및 선택할 수 있도록이 솔루션을 사용할 것입니다.

<style type="text/css">
*:not(input,textarea) {
    -webkit-touch-callout: none;
    -webkit-user-select: none; /* Disable selection/Copy of UIWebView */
}
</style>


답변

설정이 어떻게 완료되었는지 모르겠지만 viewWillDisappear가 호출 될 때 pasteBoard를 지우지 않는 이유는 무엇입니까? 아마도 appDelegate.m에서 다음과 같이 될 것입니다.

[UIPasteboard generalPasteboard].string = nil;

이렇게하면 사용자가 복사 한 데이터가 무엇이든 앱 외부에 붙여 넣을 수 없게됩니다.

또한 Engin이 말한 것처럼 uiwebview를 포함하는 컨트롤러 클래스에서 canPerformSelector 메서드를 재정의 할 수 있습니다.


답변

TPoschel 답변은 corrent이지만 제 경우에는 순서가 중요했습니다.

// this works - locks selection and callout
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
}

// this doesn't work - locks only callout
- (void)webViewDidFinishLoad:(UIWebView *)webView {
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
}


답변

나는 이것이 당신에게 확실히 효과가 있음을 확인할 수 있습니다.

<style type="text/css">
  *:not(input):not(textarea) {
   -webkit-user-select: none; /* disable selection/Copy of UIWebView */
   -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */
   }
</style>

앵커 버튼 태그 만 비활성화하려면 이것을 사용하십시오.

    a {-webkit-user-select: none; /* disable selection/Copy of UIWebView */
   -webkit-touch-callout: none; /* disable the IOS popup when long-press on a link */
     }