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


121

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

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

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

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

webViewDidFinishLoad:

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

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

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

답변:


280

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

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

<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];
}

1
UIWebView카테고리를 사용하여 확장하십시오 .
Deepak Danduprolu

4
Engin, 첫 번째는 Mobile Safari, iOS 4.3.1에서 작동합니다. 그러나 WrightCS는 선택기를 추가하는 것을 잊었습니다. 모든 요소에 적용하려면 다음과 같이 별표를 사용하십시오. * {/ * css goes here * /}
fisherwebdev 2011 년

1
스타일 추가는 내 PhoneGap 앱 내부의 링크를 탭할 때 나타나는 메뉴를 제거하는 데 완벽하게 작동했습니다.
spatical

7
canPerformAction잘라 내기, 복사, 붙여 넣기 메뉴를 비활성화하지 않습니다. 그리고 선택, 모두 선택 메뉴. 이 문제를 해결하는 방법? -webkit-touch-calloutremoveAllRanges사용자 입력을 중단. 제공된 모든 방법을 사용할 수 없음 :(
Dmitry

4
이러한 선택 안 함 스타일을 *전역 범위 에 두는 문제 는 웹 양식에서 사용자 입력을 중지한다는 것입니다. body대신 태그 안에 배치하여 더 나은 결과를 얻었습니다 .
David Douglas

104

다음 코드가 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'")!
}

2
iOS 7에서 확인되었습니다! 참고 : 두 문자열을 연결하여 두 호출을 하나로 그룹화 할 수 있습니다.
Bigood

iOS 9.x에서는 위를 사용하더라도 길게 누르면 화면 상단에 빈 콜 아웃이 나타납니다.
DwarDoh

위의 코드를 어떻게 사용할 수 있습니까? 저는 JS를 알고 있습니다. 객관적인 c 코드를 편집하거나 phonegap 플러그인을 변경할 수있는 방법을 모르겠습니다. 누구든지 도울 수
있다면

iOS 9 및 10 완벽한 사람과 함께 작업하세요!
ΩlostA

25

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 */

}

나는 jQuery Mobile과 Phonegap Build를 사용하고 있으며 이것은 나를 위해 일했습니다. 나는 처음에을 시도 *:not(input,textarea) {-webkit-touch-callout: none; -webkit-user-select: none;}했지만 그것은 나를 위해 속임수를 쓰지 않았습니다. 감사!
Mark Rummel 2013

18

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

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

2
이 작업을 수행하려면 텍스트 영역을 잊지 마세요!
라이언

9

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

[UIPasteboard generalPasteboard].string = nil;

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

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


1
이것은 최고의 솔루션 중 하나입니다. 이것은-(void) applicationDidEnterBackground : (UIApplication *) application 이벤트 핸들러에서 설정할 수 있습니다. 그리고 이것은 데이터가 앱 밖으로 나가지 않도록합니다.
Krishnan

@Krishan, 스크린 샷도 중지 될 것이라고 100 % 확신하십니까?
Norman H

이 솔루션이 마음에 들지만 응용 프로그램이 활성화되어있는 동안 대지에 남아 있기 때문에 백그라운드 스레드에서 실행중인 다른 (악의적 인) 응용 프로그램이 데이터가있는 동안 일반 대지를 액세스 할 수 있습니다.
binary_falcon 2014 년

이것은 또한 앱에서 데이터를 제거하지 않습니까? 아마도 데이터가 나타나고 사라질 때 다시 설정하면 더 잘 작동 할 것입니다
Hamzah Malik

7

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';"];
}

7

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

<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 */
     }

5

일 주일간 대단한 성과! 여러 페이지에 마우스 이벤트 및 사용자 입력을 저장하려는 경우 다른 모든 대답은 올바르지 않습니다.

1) Swizzle 방법 ( rentzsch / jrswizzle 라이브러리 사용) :

[NSClassFromString(@"UIWebDocumentView") jr_swizzleMethod:@selector(canPerformAction:withSender:) withMethod:@selector(myCanPerformAction:withSender:) error:nil];

NSObject + myCanPerformAction.h :

@interface NSObject (myCanPerformAction)

- (BOOL)myCanPerformAction:(SEL)action withSender:(id)sender;

@end

NSObject + myCanPerformAction.m :

#import "NSObject+myCanPerformAction.h"

@implementation NSObject (myCanPerformAction)

- (BOOL)myCanPerformAction:(SEL)action withSender:(id)sender {
    if (action == @selector(copy:)) {
        return [self myCanPerformAction:action withSender:sender];
    }
    if (action == @selector(paste:)) {
        return [self myCanPerformAction:action withSender:sender];
    }
    return NO;
}

@end

2) UIView에 UIWebView를 놓고 코드를 추가하십시오.

    UITapGestureRecognizer* singleTap = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)] autorelease];
    singleTap.numberOfTapsRequired = 2;
    singleTap.numberOfTouchesRequired = 1;
    singleTap.delegate = self;
    [self.view addGestureRecognizer:singleTap];

그리고 이것:

- (void)handleSingleTap:(UIGestureRecognizer*)gestureRecognizer {
    return;
}

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    if ([otherGestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
        UITapGestureRecognizer *gesture = (UITapGestureRecognizer *)otherGestureRecognizer;
        if (gesture.numberOfTapsRequired == 2) {
            [otherGestureRecognizer.view removeGestureRecognizer:otherGestureRecognizer];
        }
    }
    return YES;
}

2
이것이 무엇을 해야하는지에 대한 설명이 좋을 것입니다. 특히 제스처가 singleTap이라고 부르지 만 두 번의 탭이 필요한 이유에 대해 혼란 스럽습니다.
arlomedia

5
    let longPress:UILongPressGestureRecognizer = UILongPressGestureRecognizer(target: nil, action: nil)
    longPress.minimumPressDuration = 0.2
    webView.addGestureRecognizer(longPress)

이 코드를 viewDidLoad ()에 추가하기 만하면됩니다. 사용자는 링크를 클릭 할 수 있지만 내용을 복사 할 수 없습니다.


4

주어진 첫 번째 솔루션은 UIWebView에 .pdf를로드 할 때까지 완벽하게 작동했습니다.

.doc 파일을로드하는 것은 완벽하게 작동했지만 .pdf를로드하면 다음 코드 줄이 더 이상 원하는 효과를 얻지 못하고 사용자가 길게 터치하면 복사 / 정의 메뉴가 다시 나타납니다.

    [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];

머리카락을 당기는 또 다른 한판 후 나는 Johnny Rockex에 의해 여기 에서이 답변을 발견했으며 챔피언처럼 작동했습니다. PDF 파일을 표시 할 때 복사 / 붙여 넣기없이 UIWebView

쉽게 구현할 수있는 천재적인 솔루션에 감사드립니다 !!


2

나를 위해, 나는 이미지 '인출하도록 한 NSData에서 UIWebView로를LongPressGesture .

그러나 돋보기 및 복사 / 붙여 넣기 / 잘라내 기는 항상 내 func가 실행되기 전에 발생합니다.

그리고 나는 이것을 발견했습니다. 여기에 이미지 설명 입력

즉, 돋보기와 복사 / 붙여 넣기 / 잘라내기를 실행하는 데 0.5 초가 필요하므로 함수를 0.49 초 안에 실행할 수 있다면 DONE!

self.longPressPan.minimumPressDuration = 0.3

아이폰 OS 9 + 엑스 코드 7 GM의 나를 위해이 작품은, 내가 노력 다른 방법은 아이폰 OS 7 & 8 단지 유용하다
개원 쑤

-4

웹보기 차단 기능 사용

   webView.userInteractionEnabled = false

그것은 나를 위해 작동합니다

추신 : 사용자가 webview와 다시 상호 작용할 수 있기를 원할 때 상호 작용을 다시 활성화해야합니다.


1
stackoverflow에 오신 것을 환영합니다. 대답이이 오래된 질문에 실제로 가치를 더합니까? 답변 방법을 검토하십시오 .
dbank

1
답변의 가치를 높이려면 답변을 확장하는 것을 고려하십시오 (작은 코드 예제 제공). 또한 'it works for me'가 포함 된 답변은 자신감을 불러 일으키지 않습니다. 답변을있는 그대로 제시 한 다음 누군가가 답변에 대한 설명을 요청하는 경우 문제를 해결하는 것이 좋습니다.
Aaron D
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.